使用ISAPI和IIS从重定向响应的位置Url中删除特定的查询字符串

时间:2012-09-04 15:56:28

标签: iis iis-7 httpmodule isapi-rewrite

我有一些查询字符串键(“移动”,“nomobile”等),我不想在任何301重定向响应中发送。

例如,假设我有重定向到/about-us的网址/about

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

默认情况下重写规则会在重定向Url中保留querystings。对于这样的传入Url:

/about?mobile=true&xyz=1

如果应用了重定向规则,我希望服务器使用从重定向Url中删除移动查询字符串但仍包含xyz查询字符串的位置Url进行响应。所以我希望此请求返回此目标网址:

/about?xyz=1

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

我有数以千计的ISAPI RewriteRules,因此我不想对每条规则应用RewriteCond

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

1 个答案:

答案 0 :(得分: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>