Postback problem when using URL Rewrite and 404.as

2019-05-15 00:56发布

I'm using URL rewrite on my site to get URLs like:
http://mysite.com/users/john
instead of
http://mysite.com/index.aspx?user=john

To achive this extensionless rewrite with IIS6 and no access to the hosting-server I use the "404-approach". When a request that the server can't find, the mapped 404-page is executed, since this is a aspx-page the rewrite can be performed (I can setup the 404-mapping using the controlpanel on the hosting-service).

This is the code in Global.asax:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    string url = HttpContext.Current.Request.Url.AbsolutePath;
    if (url.Contains("404.aspx"))
    {
        string[] urlInfo404 = Request.Url.Query.ToString().Split(';');
        if (urlInfo404.Length > 1)
        {
            string requestURL = urlInfo404[1];
            if (requestURL.Contains("/users/"))
            {
                HttpContext.Current.RewritePath("~/index.aspx?user=" + GetPageID(requestURL));              
                StoreRequestURL(requestURL);
            }
            else if (requestURL.Contains("/picture/"))
            {
                HttpContext.Current.RewritePath("~/showPicture.aspx?pictureID=" + GetPageID(requestURL));
                StoreRequestURL(requestURL);
            }
        }
    }
}

private void StoreRequestURL(string url)
{
    url = url.Replace("http://", "");
    url = url.Substring(url.IndexOf("/"));
    HttpContext.Current.Items["VirtualUrl"] = url;
}

private string GetPageID(string requestURL)
{
    int idx = requestURL.LastIndexOf("/");
    string id = requestURL.Substring(idx + 1);
    id = id.Replace(".aspx", ""); //Only needed when testing without the 404-approach
    return id;
}

And in Page_Load on my masterpage I set the correct URL in the action-attribute on the form-tag.

protected void Page_Load(object sender, EventArgs e)
{
    string virtualURL = (string)HttpContext.Current.Items["VirtualUrl"];
    if (!String.IsNullOrEmpty(virtualURL))
    {
        form1.Action = virtualURL;
    }
}

The rewrite works fine but when I perform a postback on the page the postback isn't executed, can this be solved somehow?

The problem seems to be with the 404-approach because when I try without it (and loses the extensionless-feature) the postback works. That is when I request:
http://mysite.com/users/john.aspx

Can this be solved or is there any other solution that fulfil my requirements (IIS6, no serveraccess/ISAPI-filter and extensionless).

7条回答
相关推荐>>
2楼-- · 2019-05-15 01:08

try something like this:

            if (Request.HttpMethod == "GET" && shouldChangeUrl)
            {
                urlRedirect = "REAL-URL-HERE";

                _postBackUrl = urlRedirect;
                Context.RewritePath(urlRedirect);
            }
            else
                //If Post Back (Request.HttpMethod="POST")
                Context.RewritePath(_postBackUrl);

So, you save the real URL for the postback in a variable (here: _postBackUrl) when rewriting the url and then use it only when postback.

查看更多
等我变得足够好
3楼-- · 2019-05-15 01:09

form1.Action = Request.RawUrl is also how it is written in C# put it in the page load method

查看更多
The star\"
4楼-- · 2019-05-15 01:11

Scott Guthrie covers different ways of doing this here without IIS access:

http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

Personally, I've created HTTPModules in the past and it's pretty easy to put together.

查看更多
我欲成王,谁敢阻挡
5楼-- · 2019-05-15 01:11

The problem is within the 404 handling. Your form is posting to a non-exising page, ASP.NET redirects the request to the 404 page and so it loses all the postback data.

The only solution is to set the form's action attribute to the existing page, so users will see the index.aspx?user=john when they submit the form. For SEO this would not be a problem, since crawlers don't issue posts and therefore do not see the ugly address.

查看更多
爱情/是我丢掉的垃圾
6楼-- · 2019-05-15 01:12

You could just use the below instead:

form1.Action = Request.RawUrl

I'm not sure what that would be in C#, but this is what it is in VB and it works a treat

查看更多
走好不送
7楼-- · 2019-05-15 01:14
form1.Action = Request.RawUrl

in combination with

HttpContext.Current.RewritePath("/Default.aspx", true); 

works very well for me.

setting the form Action attribute was the piece i was missing...

Thanks for the solution!!!

查看更多
登录 后发表回答