1

我正在构建一个广泛使用 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);
}

我真的很感谢你的帮助!

4

4 回答 4

2

您不能使用 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=Store&category2=Kitchen&category3=Pastry%2f+Decorating
from:
/MySite/Store/Kitchen/Pastry%2f+Decorating.aspx

另外考虑使用路由而不是 UrlRewrite。

干杯,
德米特里。

于 2009-08-14T00:42:47.283 回答
1

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

于 2009-08-13T23:32:16.177 回答
0

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

于 2009-08-14T01:18:53.470 回答
0

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

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

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

ASP.Net URL 编码

于 2009-08-25T19:25:27.800 回答