如何允许URL在ASP.NET MVC5中包含点?

时间:2014-08-19 14:55:13

标签: c# asp.net regex asp.net-mvc asp.net-mvc-5

我正在开设一个网站,该网站应允许网址中的点,例如www.mysite.com/somedata/my.name-123。 我希望的行为是使该网址相当于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,然后检查用户在我的应用程序的控制器中查找的内容,而不是添加尾部斜杠。我的基本规则如下:

<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>

请注意,每次删除一个点,因此具有多个点的网址会多次触及此规则。如果网址可能有大量的点,那就太糟糕了。

如果静态文件路径没有直接映射它的磁盘位置,我的方法会使它崩溃。为了避免出现问题,我们需要为我们需要的文件结尾添加删除点规则的例外。 Seb Nilsson在“为特定文件结尾添加条件”部分下解释了如何执行此操作in this blog post

1 个答案:

答案 0 :(得分:4)

我记得几个月前面对这种情况。我真的很匆忙,所以我所做的可能不是推荐的方法。

我只指定一个细分,然后将适当的正则表达式创建为约束

例如,它最终会是这样的:

网址somedata/{dotted}

约束dotted: "(.*\.)*.*"

正则表达式非常通用,你应该重新表示它只接受支持的字符,以避免无效的符号。