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

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

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

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

  • <modules runAllManagedModulesForAllRequests="true">到web.config中的system.webServer部分实际上可行,但由于许多原因,本文不公开这种做法,所以我试图在可能的情况下避免使用这种方法。

  • 追加斜线(/)到URL也解决了这个问题,但这样做会导致Google认为我正在提供重复内容,所以我无法使用此解决方案。

  • 我想不出任何其他的选择。 理想情况下,我想添加一个新的处理程序,并使其适用于除特定模式(.css,.js)之外的所有网址。


    更新:我找到了适合我的解决方案。 我将尝试解释我采取的步骤:

    首先,我找到了一个很好的解释为什么会发生这种行为: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>
    

    请注意,一次删除一个点,所以具有多个点的网址会多次出现此规则。 如果网址可能有大量的点,这很糟糕。

    如果一个静态文件路径没有直接映射它的磁盘位置,我的方法会使它崩溃。 为了避免出现问题,我们需要为我们需要的文件结尾添加例外情况。 Seb Nilsson在本博文中解释了如何在“为特定文件结束添加条件”部分下执行此操作。


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

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

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

    urlsomedata/{dotted}

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

    该正则表达式非常通用,您应该将其重新配置为仅接受支持的字符 ,以避免无效的符号。

    链接地址: http://www.djcxy.com/p/80947.html

    上一篇: How to allow URLs to contain dots in ASP.NET MVC5?

    下一篇: Can't set certain fonts in Interface Builder Xcode 6