【发布时间】:2014-08-19 14:55:12
【问题描述】:
我正在开发一个应该允许在 URL 中使用点的网站,例如 www.mysite.com/somedata/my.name-123。
我想要的行为是使该 url 等效于 www.mysite.com/somedata/myname-123,但我得到了 404 错误,因为这些点使 IIS 尝试查找静态文件。可以在here 找到类似的问题,但建议的解决方案在我的情况下不起作用,如下所述。这是我尝试过的:
像建议的in the answer accepted in the old question 这样添加一个新的处理程序不起作用,因为我需要它来处理多个路径。如果我设置 path="*" 那么所有静态文件(例如 .css 文件)都会失败。我可以使用 RegEx 指定一个 url 模式,但据我所知 path 属性不允许它(只允许使用通配符)
在 web.config 中使用像
<httpRuntime relaxedUrlToFileSystemMapping="true" />和<requestFiltering allowDoubleEscaping="true"/>这样的行在 MVC5 中根本不起作用。将
<modules runAllManagedModulesForAllRequests="true">添加到 web.config 中的 system.webServer 部分确实有效,但由于许多原因不鼓励这种做法,暴露了in this article,所以我尽量避免这种方法。在 URL 中添加尾部斜杠 (/) 也可以解决问题,但这样做会导致 Google 认为我在提供重复的内容,因此我无法使用此解决方案。
我想不出任何其他选择。理想情况下,我想添加一个新的处理程序并使其适用于所有 URL,除了那些以某些模式(.css、.js)结尾的 URL。
更新: 我找到了适合我的解决方案。我将尝试解释我采取的步骤:
首先,我找到了一个很好的解释为什么会发生这种行为:Scott Forsyth's blog。还讨论了上面列出的一些解决方案。在对文章进行评分后,我决定使用重写规则来处理带点的 url。我没有添加尾部斜杠,而是决定提供没有麻烦点的 url,然后检查用户在我的应用程序控制器中寻找的内容。我的基本规则如下所示:
<rule name="remove troublesome dots" stopProcessing="false">
<match url="^(.*)\.(\S*)$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="{R:1}{R:2}" />
</rule>
请注意,一次删除一个点,因此带有多个点的网址会多次符合此规则。如果 url 可能有大量的点,这很糟糕。
如果静态文件路径不直接映射它的磁盘位置,我的方法会使其崩溃。为了避免问题,我们需要为我们需要的文件结尾的删除点规则添加例外。 Seb Nilsson 在“为特定文件结尾添加条件”部分解释了如何操作in this blog post。
【问题讨论】:
标签: c# asp.net regex asp.net-mvc asp.net-mvc-5