Page not redirecting properly, URL rewriting (Asp.

2019-06-13 19:35发布

问题:

I am working on URL rewrite and I found one tutorial on asp.net site, The way I am doing it is

URL I am entering http://localhost:1573/WebNew/web/first-web

Now I have wriiten one class

public class FixURLs : IHttpModule 
{
    public FixURLs()
    {
        //
        // TODO: Add constructor logic here
        //
    }

    #region IHttpModule Members

public void Dispose()
{
    // do nothing
}

public void Init(HttpApplication context)
{
    context.BeginRequest += new EventHandler(context_BeginRequest);
}

#endregion

void context_BeginRequest(object sender, EventArgs e)
{
    HttpApplication app = (HttpApplication)sender;

    /*// checking page extension
    switch (System.IO.Path.GetExtension(app.Request.Url.AbsoluteUri.ToLower()))
    {
        case ".bmp":
        case ".gif":
        case ".jpg":
        case ".jpe":
        case ".jpeg":
        case ".png":
        case ".css":
        case ".js":
        case ".txt":
        case ".swf":
            // don't redirect, these requests may required in many cases
            return;
            break;
    }*/

    if (app.Request.RawUrl.ToLower().Contains("/web/"))
    {
        **if (app.Request.RawUrl.ToLower().Contains(".png")
              || app.Request.RawUrl.ToLower().Contains(".gif")
              || app.Request.RawUrl.ToLower().Contains(".js"))
        {
            return;
        } **
        DatabaseLayer dbLayer = new DatabaseLayer();

        string urlFromBrowser = app.Request.RawUrl.ToLower();
        string[] urlFormat = urlFromBrowser.Split('/');
        urlFromBrowser = urlFormat.GetValue(2).ToString() + "/" + urlFormat.GetValue(3).ToString();

        int WebId = dbLayer.GetWebURLId(urlFromBrowser.Trim());

        app.Context.RewritePath("Default.aspx", "", "WebId="+WebId);

    }
}

But the problem is that, it is not redirecting to the Default.aspx page.

I am getting the below error:

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly.

Requested URL: /WebNew/web/Default.aspx

I can see that it is requesting the URL /webNew/web/Default.aspx but I just need /webnew/default.aspx?WebId=2

Please assist me

EDIT

Thnks for the answer, but I am not able to accept your answer nor the comment button is working for me, that is the reason I am editing my post . I am getting JavaScript error: Object expected and Object question is null.

@Waqas Raja Thanks for you answer, it is working fine now. But when I placed the breakpoint at (!IspostBack) event of Default.aspx page, I can see that it is coming aroung 8 times. After loading the page few images are gone. Is multiple refresh is the issue? Any idea why it is going again and again to if(!IsPostBack) event. Thanks for your help

EDIT1

@Waqas Raja I will accept you answer after login from the differnt browser.

EDIT2

@Waqas Raja I am showing image on my home page like this

There are other few images which are also being displayed in this manner, they all are coming properly when loading normally but when I am using URL rewriting I can see only alt text.

I have tried this also

but same result. :-( any suggestion?

By checking the raw url i can see that there are many request other than the page, i.e. jpg,.js just like you mentioned. I have updated the code, is it correct? because I am not able to see images and few javascript functions.

EDIT3

@Waqas Raja Thanks a lot for your assistance. I can now see the images. I have removed the HTML image to asp:Image controla and keeping ImageURL as ~/images/facebook_icon.png.

But I still can't see the JS file effects on the page, I put src="~/JS/jQuery.js" but it is still not working. I have placed the code mentioned by you in my Class [Just where you have guided me].

回答1:

The problem is with your rewrite path, replace it with the following

app.Context.RewritePath("~/webnew/Default.aspx", "", "WebId=" + WebId);

Edit 1 Your requirements have been changed, however let me try to explain whats going wrong.

The problem must be with your relative paths of images and also it could occur in case of external javascript and css.

You should use path relative to your root directory.

~ refers to Root directory of virtual directory whose resource (usually page or sometime external css) is being accessed.

~/pathToImagesFolder/imageName.ext

You should be cautious when including javascript and css and use path relative to home directory of your website or virtual directory. However inside css there is no step needed to be taken in this regard.

Regarding IsPostBack problem

I guess the issue is with your if condition

if (app.Request.RawUrl.ToLower().Contains("/web/"))

Here you are redirecting any request which contains /web/ in URL and most probably inside your page you are accessing some resources like images or external css or js which contains /web/ in their url and so when the request reaches it is being redirected to default.aspx and the issue raises. You can confirm it by looking into Request.RawUrl in Page_Load event of Default.aspx

So, you need more checks when comparing requested resource path and redirecting. More beautiful it be if you check and skip redirecting all urls which ends with the extensions like .css .jpg .JPG .js .gif e.t.c

I hope your understandings build now.

Edit 2 You need to skip all the other extensions

// checking page extension
switch (System.IO.Path.GetExtension(app.Request.Url.AbsoluteUri.ToLower()))
{
    case ".bmp":
    case ".gif":
    case ".jpg":
    case ".jpe":
    case ".jpeg":
    case ".png":
    case ".css":
    case ".js":
    case ".txt":
    case ".swf":
        // don't redirect, these requests may required in many cases
        return;
        break;
}