Asp.net mvc 4 Asp.net MVC4捆绑包被尾部斜杠的URL重写规则破坏

Asp.net mvc 4 Asp.net MVC4捆绑包被尾部斜杠的URL重写规则破坏,asp.net-mvc-4,iis-7,url-rewriting,routes,Asp.net Mvc 4,Iis 7,Url Rewriting,Routes,我正在现有站点下的虚拟路径中托管我的mvc4应用程序: 即: 如果URL中未提供尾随斜杠,则存在一个众所周知的相对路径中断问题。 因此,如果用户像我上面所做的那样键入URL,那么将找不到使用相对路径的脚本、样式等 如果提供了尾部斜杠,则一切正常 为了解决这个问题,我安装了URL Rewrite(),并添加了规则,以便在不存在尾随斜杠的情况下追加斜杠。这是一个预定义的规则,如下所示: <rewrite> <rules> <rule name="AddTrail

我正在现有站点下的虚拟路径中托管我的mvc4应用程序:

如果URL中未提供尾随斜杠,则存在一个众所周知的相对路径中断问题。 因此,如果用户像我上面所做的那样键入URL,那么将找不到使用相对路径的脚本、样式等

如果提供了尾部斜杠,则一切正常

为了解决这个问题,我安装了URL Rewrite(),并添加了规则,以便在不存在尾随斜杠的情况下追加斜杠。这是一个预定义的规则,如下所示:

<rewrite>
<rules>
    <rule name="AddTrailingSlashRule1" stopProcessing="true">
        <match url="(.*[^/])$" />
        <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        </conditions>
        <action type="Redirect" url="{R:1}/" />
    </rule>
</rules>

如果要防止在提交查询字符串时发生此规则,可以使用以下条件:

<rule name="Add Trailing Slash" stopProcessing="true">
    <match url="^(.*)/$" negate="true" />
    <action type="Redirect" url="{R:0}/" />
    <conditions>
        <add input="{QUERY_STRING}" pattern="(.+)" negate="true" />
    </conditions>
</rule>

当查询字符串的
(.+)
(至少在字符上)为true时,该条件将确保不执行此规则(
negate=“true”


我还更改了匹配,使用了一种对我来说更清晰、更合适的否定形式,但如果你的规则对你有效,请保持原样

这听起来像是安装此修复程序应该修复的症状之一。
以下是如何添加文件夹排除:

<rule name="AddTrailingSlashRule1" stopProcessing="true">
   <match url="(.*[^/])$" />
   <conditions>
      <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
      <add input="{URL}" pattern="myBundle$" negate="true" />
   </conditions>
   <action type="Redirect" url="{R:1}/" redirectType="Found" />
</rule>

只需为您的排除添加新的{URL}行。此示例以myBundle“结尾”,但您可以使用以下内容:

<add input="{URL}" pattern="/bundles/" negate="true" />

它将执行包含搜索,因为它不检查开始(^)或结束($)


如果您想反转逻辑,只包含某些路径,那么请删除{URL}行上的negate=“true”,并将模式设置为您想要包含的模式。

问题不在于查询字符串,而在于捆绑包既不是文件也不是目录。我在主控制器中使用永久重定向解决了这个问题,确保在用户忘记后使用尾随斜杠。@RacielR。你能把你的解决方案作为答案发布并接受吗?我用目前对我有效的解决方案更新了我的问题。我把这个问题公之于众,因为它的范围比我的问题更广。Raciel R,我认为cheesemacfly的解决方案是个好主意。检查是否存在查询字符串不是一个好方法来判断它是否是一个应该忽略的异常吗?一件事是匹配上的否定选项对根路径(www.domain.com)不起作用,因此我将结合您的两个规则。但除此之外,我喜欢它。我仍然会发布一个关于如何排除某些路径的示例。它不会安装在我的服务器上。我有运行.NET4.5的IIS7.5,这适用于.NET4.0Duh-我发誓我试过这个。简单的解决方案,捆绑包现在可以了。我仍然存在只需要在启动的控制器中强制执行尾部斜杠的问题。事件当您的解决方案工作正常时,将尾部斜杠添加到应用程序中的所有URL会断开使用虚拟路径引用的内容的根。这是我在《特别是关于》杂志上发表的一个问题,我认为这是一个公认的答案。
<add input="{URL}" pattern="/bundles/" negate="true" />