什么先运行,Url重写规则(303重定向)或Code Behind Response.Redirect(...)?

时间:2014-01-17 17:16:01

标签: asp.net iis url-rewriting

要点:

如果我有这两件事:

  1. ASP.Net页面Page1.aspx上有Reponse.Redirect(“/ Page2.aspx”) Page_Load事件
  2. IIS上的URL重写规则,其中“* / Page1.aspx”被重定向(303)为“/Page3.aspx”
  3. 先运行什么,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

    根据网站所有者的要求(我无法控制),该特定密钥(无毛 - 除臭剂)已经改变(无毛 - 除臭 - 密 - 石灰 - 薄荷 - 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. 也许我的规则是错的?
    3. 注意:重写规则正在该网站上运行。例如,任何对“www.inhibitif.com”的调用都会被重写为“inhibitif.com”

2 个答案:

答案 0 :(得分:1)

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

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

  

...应用程序对象,如HttpContext,HttpRequest和    HttpResponse 已创建并初始化。 ... HttpResponse对象包含发送给客户端的响应   包括所有渲染的输出和cookie。

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

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

实际测试这个理论会很有趣,我今天有几分钟的时间会这样做。从Response.Redirect actually uses a 302 redirect开始,通过查看对Page1.aspx请求的响应,可以很容易地判断出来(看看你是否有303或302。

答案 1 :(得分:1)

简答:

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


<强>详细信息:

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

enter image description here

这是修改后的(工作)规则。注意我还修改了动作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的答案中查看有关它首先触发的详细信息。