【问题标题】:What runs first, Url Rewrite rule (303 Redirect) or Code Behind Response.Redirect(...)?首先运行的是 URL 重写规则(303 重定向)还是 Response.Redirect(...) 后面的代码?
【发布时间】:2014-01-17 17:16:00
【问题描述】:

总结:

如果我有这两样东西:

  1. 带有 Reponse.Redirect("/Page2.aspx") 的 ASP.Net 页面 Page1.aspx Page_Load 事件
  2. IIS 上的 URL 重写规则,其中“*/Page1.aspx”被重定向 (303) 到“/Page3.aspx”

什么先运行,1 还是 2?

(ASP.Net版本为4.0,IIS版本为7.5)


实战案例

http://inhibitif.com/product/Hair-Free-Deodorant

这条路线被映射到 Product.aspx 页面,其中 Hair-Free-Face-Serum 是产品密钥。如果此页面找不到产品密钥,它会在 Page_Load 事件中重定向到完整的产品列表。

http://inhibitif.com/products

根据网站所有者的要求(我无法控制),该特定密钥(Hair-Free-Deodorant)已更改(Hair-Free-Deodorant-Key-Lime-Mint-50ml)。因此,对该特定产品的任何调用都会被重定向到完整的产品列表 (/products)。因为对于 SEO,最好使用新键重定向到新产品页面(而不是重定向到通用产品列表页面),我在 IIS 上添加了这个重写规则

<rule name="Old Product Key: Hair-Free-Deodorant" patternSyntax="Wildcard" stopProcessing="true">
    <match url="*/product/Hair-Free-Deodorant" />
    <action type="Redirect" url="/product/Hair-Free-Deodorant-Key-Lime-Mint-50ml" />
</rule>

规则永远不会触发。总是调用重定向。

  1. 我知道我可以将此逻辑添加到 Page_Load 事件处理程序,但是, 不应该反过来吗? IIS规则不应该得到 优先级?
  2. 也许我的规则是错误的?

注意:重写规则正在网站上运行。例如,任何对“www.inhibitif.com”的调用都会被重写为“inhibitif.com”

【问题讨论】:

  • 感谢您添加该信息。我已经删除了我的答案,因为我认为它不能回答你的实际问题,因为我看到了所有的细节(它实际上可能是不正确的)。值得一提的是,由于重定向是 302(这就是 Response.重定向使用)。
  • 你是对的。重写首先运行。匹配模式格式错误。请参阅我自己对这个问题的回答。谢谢!

标签: asp.net iis url-rewriting


【解决方案1】:

根据 MSDN 上“ASP.NET Application Life Cycle Overview for IIS 7.0 ”文章中的文档,我希望 IIS 重定向发生在 Page_Load 重定向之前。

请注意,“为每个请求创建响应对象。”阶段首先发生,其中包含以下活动:

...应用程序对象,例如 HttpContext、HttpRequest 和 HttpResponse 被创建和初始化。 ... HttpResponse 对象包含发送给客户端的响应,它 包括所有呈现的输出和 cookie。

此时,由于 IIS 知道响应是指向特定页面的 303 重定向,我希望它将响应加载到 Response 对象中。

在这一切之后,“请求由 HttpApplication 管道处理”阶段发生,该阶段贯穿 ASP.NET 页面生命周期(包括 Page_Load)。

实际测试这个理论会很有趣,当我今天有几分钟的时间时,我会这样做。由于 Response.Redirect actually uses a 302 redirect,这应该很容易通过查看对 Page1.aspx 请求的响应来判断(查看您得到的是 303 还是 302。

【讨论】:

  • 非常感谢您提供详细信息。这就是我所期望的(规则优先),但在这种情况下,规则永远不会触发:(我已在问题中添加了有关实际案例的信息。
  • @cockypup 感谢您添加更多信息!我不肯定,但我不知道您的重定向是否设置正确。
  • @cockypup 你能把你的规则改成url=".*/product/Hair-Free-Deodorant",看看能不能解决问题?我所做的只是在星号 (*) 前加一个点 (.)。
  • @如果我这样做(添加 .)并在 IIS 上尝试该模式(单击测试模式)然后 IIS 报告像 inhibitif.com/product/Hair-Free-Deodorant 这样的 url 与该模式不匹配。反正我试过了,还是没解决问题。我还尝试在重写“〜/product/Hair-Free-Deodorant-Key-Lime-Mint-50ml”的开头添加“〜”,但没有运气:(
  • @cockypup 很奇怪!我在这个regex testing website 上试过,它认为这是匹配的。所以也许你的匹配是有效的,而我的答案不正确(它首先点击了 Page_Load 重定向)。
【解决方案2】:

简答:

重写规则首先运行。 模式格式不正确。


详情:

重写规则格式错误。匹配模式的开头不需要“*/”。如IIS规则列表页面所示,输入只需匹配“'/'后的URL路径”即可。

这是修改后的(工作)规则。请注意,我还修改了操作 url(删除了开头的“\”),尽管这似乎没有必要——它可以工作。比赛编辑是诀窍:

<rule name="Old Product Key: Hair-Free-Deodorant" patternSyntax="Wildcard" stopProcessing="true">
   <match url="product/Hair-Free-Deodorant" />
   <action type="Redirect" url="product/Hair-Free-Deodorant-Key-Lime-Mint-50ml" />
</rule> 

更改规则后,重写首先开始触发(在重定向后面的代码之前)。在下面的 jadarnel27 的回答中查看有关它为什么首先触发的详细信息。

【讨论】:

  • 很高兴你明白了!我将继续取消删除我的答案,因为它不是不正确的,并且其他详细信息可能对将来的人们有所帮助。
  • 完美并同意。编辑了我的答案并添加了对你的参考。
猜你喜欢
  • 2011-09-08
  • 2014-05-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 2012-05-27
相关资源
最近更新 更多