2

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

http ://www.mysite.com/myApp

如果URL 中未提供尾部斜杠,则相对路径会被破坏,这是一个众所周知的问题。因此,如果用户像我上面那样键入 URL,则不会找到使用相对路径的脚本、样式等。

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

为了解决这个问题,我安装了URL Rewrite ( http://www.iis.net/downloads/microsoft/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>

到目前为止一切顺利,唯一的问题是现在通过在包名称/ url 和 chache 破坏之间添加一个斜杠来破坏包:

IE:

http://www.mysite.com/myApp/bundles/myBundle/?v=8_EQPT2vzBgg4HcGhkeTQpLE1flm2VOsp3A1ZEy-C3k1

注意myBundle 和 ?v=8.... 之间的/ )

我曾尝试从条件中排除“捆绑”,但我没有运气。

我想知道如何从条件中排除某些路径(并非我的所有捆绑包都在路径上使用“捆绑包”)或者可能是一个更简单的规则,允许我为我需要关心的唯一情况添加尾部斜杠about:当用户忘记在我的应用程序 url 末尾键入它时。

谢谢,R。

更新

我刚刚向我的主控制器添加了一个永久重定向条件 - 更容易被用户直接在地址栏上键入的那个。这正在解决我的问题。我让这个问题打开,以防有人通过调整路由引擎或使用 URL 重写想出一个更好的主意。

这是代码:

public ActionResult Index()
{
    if (!Request.Path.EndsWith("/"))
        return RedirectPermanent(Request.Url.ToString() + "/");
    return View();
}
4

3 回答 3

14

以下是添加文件夹排除项的方法:

<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",并将模式设置为您想要包含的内容。

于 2013-04-12T14:25:01.500 回答
0

这听起来像是安装此修复程序应该修复的症状之一。 http://support.microsoft.com/kb/2520479

于 2013-04-10T18:02:02.807 回答
0

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

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

negate="true"(.+)(至少在字符上)对查询字符串为真时,该条件将确保不执行此规则( )。

我还更改了匹配以使用对我来说更清晰和合适的否定形式,但如果您的规则适合您,请保持原样!

于 2013-04-10T17:04:33.233 回答