我将我的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();
}