1

我有一些不希望在任何 301 重定向响应中发送的查询字符串键(“mobile”、“nomobile”等)。

例如,假设我有/about-us重定向到/about.

RewriteRule ^about-us$ /about [NC,L,R=301]

默认情况下,重写规则将查询字符串保留在重定向 URL 中。因此,对于这样的传入 URL:

/about?mobile=true&xyz=1

如果应用了重定向规则,我希望服务器响应一个位置 URL,该 URL 已从重定向 URL 中删除了移动查询字符串,但仍包含 xyz 查询字符串。所以我希望这个请求与这个目标网址一起返回:

/about?xyz=1

我不希望mobile, nomobile从传入请求中删除 ( 等) 查询字符串。如果 Url 结果为 200,我希望底层 ASP.NET Web 应用程序能够看到mobile查询字符串。此查询字符串删除应该发生在重定向响应的 Location 标头(即目标 Url)上。

我有数以千计的 ISAPI RewriteRules,所以我不想将 aRewriteCond应用于每条规则。

是否有一个 ISAPI 规则或一个自定义模块我可以放置在某个地方以将此逻辑全局应用于 ISAPI 生成的重定向或来自 IIS 的任何重定向响应?谢谢你的帮助。

4

1 回答 1

2

使用IIS 中的Url Rewrite,您可以创建规则来修改出站响应标头。下面是从 Url Rewrite 工具生成的规则:

<system.webServer>
 <rewrite>
  <outboundRules>
    <clear />
    <rule name="Remove nomobile from location">
      <match serverVariable="RESPONSE_Location" pattern="^(.*)\?nomobile(.*)" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="true" />
      <action type="Rewrite" value="{R:1}?{R:2}" />
    </rule>  
    <rule name="Remove mobile=true from location">
      <match serverVariable="RESPONSE_Location" pattern="^(.*)\?mobile(.*)" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="true" />
      <action type="Rewrite" value="{R:1}?{R:2}" />
    </rule>  
    <rule name="Replace &amp;">
      <match serverVariable="RESPONSE_Location" pattern="^(.*)(\?&amp;)(.*)" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="true" />
      <action type="Rewrite" value="{R:1}?{R:3}" />
    </rule>
    <rule name="Remove empty ?" enabled="true">
      <match serverVariable="RESPONSE_Location" pattern="(.*)\?$" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="true" />
      <action type="Rewrite" value="{R:1}" />
    </rule>
  </outboundRules>
 </rewrite>
</system.webServer>
于 2012-09-07T01:21:03.027 回答