RedirectToAction()打破变音符号

一月

注:这是不是 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章