3

我在我的网站上使用 URL 重写来获取如下 URL:
http://mysite.com/users/john
而不是
http://mysite.com/index.aspx?user=john

为了使用 IIS6 实现这种无扩展重写并且无法访问托管服务器,我使用了“404 方法”。当服务器找不到请求时,执行映射的 404 页面,因为这是一个 aspx 页面,所以可以执行重写(我可以使用托管服务上的控制面板设置 404 映射)。

这是 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;
}

在我的母版页上的 Page_Load 中,我在表单标签的操作属性中设置了正确的 URL。

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

重写工作正常,但是当我在页面上执行回发时,没有执行回发,这可以通过某种方式解决吗?

问题似乎与 404 方法有关,因为当我尝试不使用它(并失去无扩展功能)时,回发工作。那是我请求的时候:http:
//mysite.com/users/john.aspx

这可以解决还是有任何其他解决方案可以满足我的要求(IIS6,没有服务器访问/ISAPI 过滤器和无扩展)。

4

7 回答 7

9
form1.Action = Request.RawUrl

结合

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

对我来说效果很好。

设置表单 Action 属性是我缺少的部分......

感谢您的解决方案!!!

于 2010-08-08T10:01:00.797 回答
4

Scott Guthrie 在这里介绍了在没有 IIS 访问的情况下执行此操作的不同方法:

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

就个人而言,我过去曾创建过 HTTPModules,而且它很容易组合在一起。

于 2009-01-04T15:57:53.223 回答
3

form1.Action = Request.RawUrl 也是C#的写法 放到页面加载方法中

于 2010-02-22T13:15:02.150 回答
1

我将从安装Live Http Headers开始,看看 Http 请求发生了什么。

啊,在那篇文章中它解释了它,看起来 form 标签的 action 属性是错误的:

人们在使用 ASP.NET 和 Url-Rewriting 时经常遇到的一个问题与处理回发方案有关。具体来说,当您<form runat="server">在页面上放置一个控件时,ASP.NET 默认会自动输出标记的“action”属性以指向它所在的页面。使用 URL-Rewriting 时的问题是控件呈现的 URL 不是请求的原始 URL(例如:/products/books),而是重写后的 URL(例如:/products.aspx?category =书)。这意味着当您向服务器进行回发时,该 URL 将不是您的干净的 URL。

在 ASP.NET 1.0 和 1.1 中,人们经常对控件进行子类化<form>并创建自己的控件来正确输出要使用的操作。虽然这可行,但它最终有点混乱 - 因为这意味着您必须更新所有页面才能使用此备用表单控件,并且有时可能会遇到 Visual Studio WYSIWYG 设计器的问题。

好消息是,在 ASP.NET 2.0 中,有一个更简洁的技巧可以用来重写<form>控件上的“action”属性。具体来说,您可以利用新的 ASP.NET 2.0 控件适配器扩展性体系结构来自定义控件的呈现<form>,并用您提供的值覆盖其“操作”属性值。这不需要您更改 .aspx 页面中的任何代码。相反,只需将 .browser 文件添加到您的 /app_browsers 文件夹,该文件夹注册一个控制适配器类以用于输出新的“动作”属性...

于 2009-01-04T15:59:57.540 回答
1

尝试这样的事情:

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

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

因此,您在重写 url 时将回发的真实 URL 保存在一个变量中(此处为:_postBackUrl),然后仅在回发时使用它。

于 2010-04-19T10:49:10.173 回答
1

您可以改用以下内容:

form1.Action = Request.RawUrl

我不确定在 C# 中会是什么,但这就是它在 VB 中的样子,而且它很有效

于 2009-11-23T22:38:06.220 回答
0

问题出在 404 处理中。您的表单正在发布到一个不存在的页面,ASP.NET 将请求重定向到 404 页面,因此它会丢失所有回发数据。

唯一的解决方案是将表单的 action 属性设置为现有页面,这样用户在提交表单时会看到 index.aspx?user=john。对于 SEO,这不是问题,因为爬虫不会发布帖子,因此看不到丑陋的地址。

于 2009-05-15T19:37:21.790 回答