ASP.Net URL编码

Kel*_*ron 7 c# asp.net iis url-rewriting url-encoding

我正在ASP.net中实现URL重写,我的URL导致我的问题世界.

URL是从部门和类别的数据库生成的.我希望员工能够使用适当的特殊字符向数据库添加项目,而不会破坏站点.

我在构造URL之前编码数据.

有几个问题......

  1. IIS在到达.net之前对URL进行解码,因此无法正确解析其中包含"/"的任何内容.
  2. ASP.net在某些页面中使用"〜"无效的网址感到困惑
  3. 我从内置测试服务器迁移到我的本地IIS服务器(XP机器),任何包含编码&(%26)的URL都会给我一个"错误请求"错误.
  4. UrlEncode留下一些破碎的字符,如'.'

我确实有两个关于这个主题的其他相关帖子,当时我只看到小问题不是上游的大问题.我发现了一些解决"错误请求"问题的注册表技巧,但我将部署到共享托管环境,使其无用.我也知道这是一个解决某些安全问题的方法,因此我不想在不知道我正在打开哪些蠕虫的情况下绕过它.

而不是试图强制.net传递原始URL,或覆盖IIS设置,我想首先制作真正安全的URL.

我会注意到我已经尝试过AntiXss.URLEncode,HttpUtility.URLEncode,URI.EscapeDataString.我甚至尝试过像双URLEncodng这样的蠢事.是否有一个实用程序可以满足我的需求,或者我真的需要自己动手.我甚至考虑做一些Hacky,比如用一个不寻常的字符串替换%.最终结果应至少是可读的,这首先是使用URL重写的重点.

很抱歉很长的帖子 - 我只是想确保我已经包含了所有必要的细节.我似乎无法找到任何相关信息,这似乎是一个常见的问题 - 所以也许我错过了一些大事.感谢您的帮助,以及对长篇解释的耐心!


为清晰起见编辑:

当我说从数据库构建网址时,我的意思是目录结构是从我的数据库中的部门和类别构建的.

一些示例URLS -

Mystore/Refrigeration/Bar + Fridge.aspx
Mystore/Cooking + Equipment.aspx
Mystore/Kitchen/Cutting + Boards.asxpx

当我使用像"Beverage&Bar"或"Pastry/Decorating"这样的部门来构建我的URL时会出现问题.尽管首先编码,但这些都会导致上述问题.

我的处理程序已经实现并且工作正常,除了特殊的字符编码问题.

eul*_*rfx 5

您应该考虑从您的类别/部门表中选择一个表,该表具有每个类别的唯一URL.然后,您可以使用特殊例程来生成URL.这可以是SQL标量函数或CLR函数,但它要做的一件事就是规范化Web的URL.您可以将"Beverage&Bar"转换为"Beverage-And-Bar"和"Pastry/Decorating"转换为"Pastry-Decorating".主要是,例程需要用其他东西替换所有无效的HTTP URL字符.一个例子是:

public static class URL
{
    static readonly Regex feet = new Regex(@"([0-9]\s?)'([^'])", RegexOptions.Compiled);
    static readonly Regex inch1 = new Regex(@"([0-9]\s?)''", RegexOptions.Compiled);
    static readonly Regex inch2 = new Regex(@"([0-9]\s?)""", RegexOptions.Compiled);
    static readonly Regex num = new Regex(@"#([0-9]+)", RegexOptions.Compiled);
    static readonly Regex dollar = new Regex(@"[$]([0-9]+)", RegexOptions.Compiled);
    static readonly Regex percent = new Regex(@"([0-9]+)%", RegexOptions.Compiled);
    static readonly Regex sep = new Regex(@"[\s_/\\+:.]", RegexOptions.Compiled);
    static readonly Regex empty = new Regex(@"[^-A-Za-z0-9]", RegexOptions.Compiled);
    static readonly Regex extra = new Regex(@"[-]+", RegexOptions.Compiled);

    public static string PrepareURL(string str)
    {
        str = str.Trim().ToLower();
        str = str.Replace("&", "and");

        str = feet.Replace(str, "$1-ft-");
        str = inch1.Replace(str, "$1-in-");
        str = inch2.Replace(str, "$1-in-");
        str = num.Replace(str, "num-$1");

        str = dollar.Replace(str, "$1-dollar-");
        str = percent.Replace(str, "$1-percent-");

        str = sep.Replace(str, "-");

        str = empty.Replace(str, string.Empty);
        str = extra.Replace(str, "-");

        str = str.Trim('-');
        return str;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以将其设置为SQL增强功能,或将URL生成作为单独的进程运行.然后,要实现映射,您可以将整个URL直接映射到类别ID.从长远来看,这种方法更好,原因有几个.首先,您并不总是生成网址,只需执行此操作一次,它们保持静态,您不必担心程序更改,然后GoogleBot无法找到旧网址.此外,如果发生碰撞,您可能会注意到潜在的重复类别名称,因为碰撞只会因特殊字符而异.最后,您始终可以从数据库中查看URL,而无需运行映射功能.