【问题标题】:URL Encoding being lost before processing - ASP.netURL 编码在处理之前丢失 - ASP.net
【发布时间】:2010-11-19 11:13:40
【问题描述】:

我正在构建一个广泛使用 URL 编码的网络商店。

我的数据库中有一个部门和类别列表,用于生成链接。当然,这些是在发送之前对 URL 进行编码的。

一些典型的链接是...
/MySite/Store/Countertop+Equipment/Can+Openers.aspx
/MySite/Store/Dinnerware.aspx时间> /MySite/Store/Kitchen/Pastry%2f+Decorating.aspx

在我的 HTTPHandler 中,我调用 app.Request.Path 来获取当前路径。此调用返回的字符串不再是 URL 编码的,这使我无法正确解析。 一旦 URL 编码丢失
/MySite/Store/Kitchen/Pastry%2f+Decorating.aspx 变为
/MySite/Store/Kitchen/Pastry/Decorating.aspx。

这显然破坏了将 URL 转换为 QueryString 的方法。

有人知道如何解决这个问题吗?

这是我的 HTTPHandler 的核心

public void Init(System.Web.HttpApplication app)
{
    app.BeginRequest += new EventHandler(Application_BeginRequest);
}

private void Application_BeginRequest(object sender, EventArgs e)
{
    System.Web.HttpApplication app = (System.Web.HttpApplication)sender;

    string realUrl = GetRealUrl(app.Request.Path);

    if (!String.IsNullOrEmpty(realUrl))
        app.Context.RewritePath(realUrl, false);
}

非常感谢您的帮助!

【问题讨论】:

  • Request 上的任何方法或属性都不能满足我的需要...看来解码可能发生在 IIS 级别之前,.net 甚至可以处理请求。我有另一个帖子,其中“~”没有使用编码 / 字符呈现正确的路径,这似乎证实了这一点。 Grr .. 如果服务器在到达应用程序之前就直接使用我的 URL,我不明白 URLEncoding 的意义何在。

标签: asp.net url-rewriting url-encoding


【解决方案1】:

您不能使用 Request.Url(包括 Url..PathAndQuery、AbsolutePath 等),因为它的 OriginalString 已经解码。

所以根本没有使用 Request.Url 的意义,您可以尝试使用以下内容:

或者在最坏的情况下,您需要解析 URL:

    [Test]
    public void RewriteProoveOfConcept() {
        var path = @"/MySite/Store/Kitchen/Pastry%2f+Decorating.aspx";
        var res = Regex.Replace(path, @"/(.+)/(.+)/(.+)/(.+)\.aspx", @"/$1/YourPage.aspx?category1=$2&category2=$3&category3=$4");
        Assert.AreEqual(@"/MySite/YourPage.aspx?category1=Store&category2=Kitchen&category3=Pastry%2f+Decorating", res);
    }

这显示了如何获取 URL:
/MySite/YourPage.aspx?category1=商店&category2=厨房&category3=糕点%2f+装饰
来自:
/MySite/Store/Kitchen/Pastry%2f+Decorating.aspx

另外考虑 using Routing 而不是 UrlRewrite。

干杯,
德米特里。

【讨论】:

  • 我浏览了请求的整个属性/方法树,不幸的是,问题似乎在上游更远,可能在 IIS 中。无论如何,感谢您的详细回复,至少让我找到了正确的检查地点。
【解决方案2】:

在 Request 对象上尝试 AbsolutePath 或 PathAndQuery 属性。他们都应该保持url编码。

【讨论】:

    【解决方案3】:

    您可以在解析之前UrlEncode URL。或者更好的是,将 URL 的非编码保留在数据库中。如果您使用 HyperLink 控件,您甚至不需要对它们进行编码。

    【讨论】:

    • 不幸的是 Url 在解析之前再次对其进行编码将无济于事,因为它将对所有斜杠进行编码,无论它们是路径的一部分还是文本的一部分。
    【解决方案4】:

    事实证明,在 .Net 甚至在处理请求之前,IIS 中就出现了问题。看来这是一条死胡同。

    另外一个警告词是,我的 IIS 测试服务器 (XP) 拒绝包含编码符号的请求,这是一种安全风险,并且无法说服它配合任何缺少注册表编辑的操作。不确定这是否适用于所有版本,但即使可以检索服务器变量,这似乎也是使用不同策略的另一个好理由。

    这是接受解决方案的后续问题-

    ASP.Net URL Encoding

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多