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

ede*_*rbf 7 c# regex asp.net asp.net-mvc asp.net-mvc-5

我正在开发一个网站,应该允许URL中的点,例如www.mysite.com/somedata/my.name-123.我希望的行为是使该URL等效www.mysite.com/somedata/myname-123,但我得到404错误,因为这些点使IIS尝试找到一个静态文件.类似的问题可以在这里找到,但是我提出的解决方案并不适用,我将在下面解释.这是我尝试过的:

  • 添加旧问题接受的答案中建议的新处理程序不起作用,因为我需要将其用于多个路径.如果我设置path ="*",那么所有静态文件(例如.css文件)都会失败.我可以使用RegEx指定一个url模式,但据我所知,path属性不允许它(只允许使用通配符)

  • 使用<httpRuntime relaxedUrlToFileSystemMapping="true" /><requestFiltering allowDoubleEscaping="true"/>web.config这样的行在MVC5中不起作用.

  • 添加<modules runAllManagedModulesForAllRequests="true">到web.config中的system.webServer部分确实可以正常工作但是由于本文中公开的许多原因而不鼓励这种做法,所以我尽量避免使用这种方法.

  • 在URL中附加一个斜杠(/)也可以解决问题,但这样做会导致Google认为我正在提供重复内容,因此我无法使用此解决方案.

我想不出任何其他选择.理想情况下,我想添加一个新的处理程序,使其适用于所有URL,但以某些模式(.css,.js)结尾的URL除外.


更新: 我找到了一个适合我的解决方案.我会尝试解释我采取的步骤:

首先,我找到了一个非常好的解释为什么会发生这种行为:Scott Forsyth的博客.还讨论了上面列出的一些解决方案.在对文章进行评论之后,我决定使用重写规则处理虚线网址.我决定在没有麻烦的点的情况下提供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>
Run Code Online (Sandbox Code Playgroud)

请注意,每次删除一个点,因此具有多个点的URL会多次触及此规则.如果网址可能包含大量点,则这很糟糕.

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

Mat*_*ero 4

我记得几个月前就遇到过这种情况。我真的很着急,所以我所做的可能不是推荐的方法。

我只指定了一个段,然后创建了适当的正则表达式作为约束

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

网址somedata/{dotted}

限制条件dotted: "(.*\.)*.*"

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