注:这是不是 RedirectToAction()
引起该问题,但重写规则web.config
原始问题:使用时有一个奇怪的行为RedirectToAction()
,我无法在本地复制(调试)。在某些时候,我的路由值从更改äa
为äa
,但仅在服务器上(Azure)。我添加了日志以查明确切的位置,并在此处结束:
RedirectToAction("square", new { id = criteria.Trim().ToLower() });
在本地,它可以正确地重定向到/find/square/äa
,但在服务器上最终指向/find/square/äa
。我记录了每个步骤,当我的字符串传递给RedirectToAction
它时,它仍然是完整的(即使在Trim()
和之后ToLower()
),但在重定向之后就损坏了。我正在使用默认路线
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }
使用controller find
,actionsquare
和id äa
(在这种情况下)
对于我来说,这真是令人惊讶,因为.NET在变音符号和UTF-8方面通常非常谨慎和健壮。我在这里特别失落,因为我无法在本地重现该问题。我认为这是服务器设置,但是Azure在这一点上很稀疏。有没有人经历过类似的行为?
这是我的代码的一部分,我没有发布重写规则。我仔细查看了Fiddler中的重定向后才发现。事实上,在我故意触发的重定向之后,我发现了另一个重定向,它是由我的重写规则之一引起的:
<rule name="Lowercase Path" stopProcessing="true" >
<match url="[A-Z]" ignoreCase="false" />
<conditions>
<add input="{REQUEST_METHOD}" matchType="Pattern" pattern="POST" ignoreCase="true" negate="true" />
<add input="{URL}" pattern="^.*\.(axd|css|js|jpg|jpeg|png|gif|txt|xml|svg|pdf)$" negate="true" ignoreCase="true" />
</conditions>
<action type="Redirect" url="{tolower:{URL}}" redirectType="Permanent" />
</rule>
实际上,这是以下行:
<action type="Redirect" url="{tolower:{URL}}" redirectType="Permanent" />
禁用此规则后,一切正常。我不使用的其他规则{ToLower:}
不会产生任何问题。我不确定为什么这不会在本地破坏事情。在进行研究时,我发现了一篇文章,描述了Microsoft如何修补损坏的重写模块,从而导致类似的变音符号问题。这是推测,但也许我的azure实例上的重写版本未打补丁-或完全不同。
不幸的是,除了使用rewrite-rule之外,几乎没有其他选择{tolower:{URL}}
,因此我不得不做一个非常丑陋的解决方法,并Global.asax.cs
像下面这样检查我的URL :
protected void Application_BeginRequest(object sender, EventArgs e)
{
var pathAndQuery = System.Web.HttpUtility.UrlDecode(Request.Url.PathAndQuery);
if (pathAndQuery == null || Regex.IsMatch(pathAndQuery, @"^.*\.(axd|css|js|jpg|jpeg|png|gif|txt|xml|svg|pdf)$"))
{
return;
}
if (Regex.IsMatch(pathAndQuery, ".*[A-Z].*"))
{
Response.Redirect(pathAndQuery.ToLower(), false);
Response.StatusCode = 301;
}
}
我对这种方法并不完全满意;感觉很臭,但在找到更好的解决方案之前,这已经足够了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句