如何在ASP中允许url包含点.净MVC5



我在一个网站上工作,应该允许点在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。

  • <modules runAllManagedModulesForAllRequests="true">加入系统。webServer部分。config确实可以工作,但由于本文中暴露的许多原因,不鼓励这种做法,所以我尽量避免使用这种方法。

  • 在URL后面添加斜杠(/)也可以解决问题,但这样做会导致谷歌认为我提供重复的内容,所以我不能使用这个解决方案。

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

更新:我找到了一个适合我的解决办法。我将试着解释我所采取的步骤:

首先,我找到了一个很好的解释为什么这种行为会发生:Scott Forsyth的博客。本文还讨论了上面列出的一些解决方案。读完这篇文章后,我决定用重写规则处理点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将多次符合此规则。如果url可能有大量的点,这是很糟糕的。

如果一个静态文件路径不直接映射它的磁盘位置,我的方法将使它崩溃。为了避免出现问题,我们需要为所需的文件结尾添加删除点规则的例外情况。Seb Nilsson在这篇博文"为特定文件结尾添加条件"一节中解释了如何做到这一点。

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

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

例如,它会像这样结束:

url: somedata/{dotted}

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

regex是非常通用的,你应该重新表述它,只接受支持的字符,以避免无效的符号。