代码之家  ›  专栏  ›  技术社区  ›  Raciel R.

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

  •  2
  • Raciel R.  · 技术社区  · 13 年前

    我正在主持我的 mvc4型 应用程序 虚拟路径 在现有场地下:

    即 : http://www.mysite.com/myApp

    如果 尾部斜线 URL中未提供。 因此,如果用户像我上面所做的那样键入URL,那么将找不到使用相对路径的脚本、样式等。

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

    为了解决这个问题,我安装了 伪静态 ( 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分解之间添加一个尾部斜杠来分解捆绑包:

    即:

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

    ( 笔记 这个 / 在myBundle和之间?v=8….)

    我试着把“捆绑包”排除在条件之外,但我运气不佳。

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

    谢谢 R

    更新

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

    这是代码:

    public ActionResult Index()
    {
        if (!Request.Path.EndsWith("/"))
            return RedirectPermanent(Request.Url.ToString() + "/");
        return View();
    }
    
    3 回复  |  直到 13 年前
        1
  •  14
  •   Scott Forsyth    13 年前

    以下是如何添加文件夹的排除:

    <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}行上的否定=“true”,并将模式设置为您想要包括的内容。

        2
  •  0
  •   cheesemacfly Deisbel R Diaz    13 年前

    如果您希望在提交查询字符串时防止出现此规则,可以使用以下条件:

    <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" )何时 (.+) (至少在字符上)对于查询字符串为true。

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

        3
  •  0
  •   Nick Albrecht    13 年前

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

    推荐文章