【问题标题】:ASP.NET MVC Colon in URLURL 中的 ASP.NET MVC 冒号
【发布时间】:2011-06-09 08:21:24
【问题描述】:

我发现 IIS 在让冒号进入 URL 时存在问题。我还看到了其他人提供的建议here

对于我正在开发的网站,我希望能够将电影、书籍等的标题传递到我的 URL 中,包括冒号,如下所示:

mysite.com/Movie/Bob:The Return

这将被我的MovieController 使用,例如,作为字符串并在后面使用。

我意识到冒号并不理想。有没有人有任何其他建议?尽管目前很糟糕,但我正在从所有冒号 (:) 到另一个字符进行查找和替换,然后当我想在 Controller 端使用它时进行反向替换。

【问题讨论】:

  • 为什么要使用冒号?您是否发现这适用于 IIS 以外的服务器?我希望冒号甚至不允许用于指定端口号,因为它会使解析协议变得更加简单。使用连字符、下划线或其他字符。或者将其设置为另一个级别,例如 mysite.com/Movie/Bob/The+Return
  • mysite.com/Movie/Bob/The+Return 的问题是弄清楚如何取电影标题(“鲍勃:归来”)并知道“嘿,标题中有一个冒号......我需要把它正确地组合起来。”
  • 也许我应该传入一个同时包含标题和 slug 的类,而不仅仅是电影标题作为字符串?

标签: asp.net-mvc url routing colon


【解决方案1】:

我通过将其添加到我的 web.config 解决了这个问题:

<httpRuntime requestPathInvalidCharacters=""/>

这必须在 system.web 部分中。

默认为:

<httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?"/>

所以只为冒号做一个例外,它会变成

<httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,\,?"/>

阅读更多:http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.requestpathinvalidcharacters.aspx

据我所知,冒号字符可以作为 URL 中的未编码字符。我不知道他们为什么将其添加到 requestPathInvalidCharacters 的默认值中。

【讨论】:

    【解决方案2】:

    考虑URL encoding and decoding您的电影片名。

    你最终会得到foo.com/bar/Bob%58The%20Return

    作为替代方案,请考虑使用HTML helper to remove URL unfriendly characters in URLs(方法为URLFriendly())。冒号和占位符(例如破折号)之间的 SEO 优势可能可以忽略不计。

    【讨论】:

    • 我尝试进行编码/解码。 IIS 似乎仍然看到并说:“嘿,这仍然是一个冒号。抛出 400 错误!”
    【解决方案3】:

    您的方法最大的担忧之一是电影名称并不总是独一无二的(例如“The Italian Job”)。还有其他非法字符(例如括号等)。

    在 url 中使用 id 号在数据库中定位电影可能是个好主意。您仍然可以在您的 url 中包含电影名称的 url 友好副本,但您不必担心返回到包含所有非法字符的原始标题。

    这个页面的 url 就是一个很好的例子。您可以看到删除页面标题仍然有效:

    ASP.NET MVC Colon in URL

    ASP.NET MVC Colon in URL

    【讨论】:

    • 这是一个有趣的想法。我得调查一下。
    【解决方案4】:

    根据RFC 3986,冒号是URI 中保留的无效字符。所以不要做违反规范的事情。您需要对其进行 URL 编码或使用其他字符。这里有一个nice blog post,你可以看看。

    【讨论】:

    • 哪里说无效?我是否错误地解释了这一点? pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
    【解决方案5】:

    最简单的方法是在构建 url 时使用 System.Web.HttpUtility.UrlEncode() 和 System.Web.HttpUtility.UrlDecode 解释返回的结果时。如果不先对值进行编码,空格字符也会出现问题。

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      相关资源
      最近更新 更多