无法获取静态重定向到与IIS URL重写工作2.0

问题描述:

本地运行以下IIS URL重写设置并不能得到它(从web.config中)工作:无法获取静态重定向到与IIS URL重写工作2.0

 <rewrite> 
     <rewriteMaps> 
      <rewriteMap name="StaticRedirects"> 
       <add key="^tvb/" value="/tv/" /> 
      </rewriteMap> 
     </rewriteMaps> 
     <rules> 
      <rule name="StaticRedirectsRule" stopProcessing="true"> 
       <match url=".*" /> 
       <conditions> 
        <add input="{StaticRedirects: {REQUEST_URI}}" matchType="Pattern" pattern="(.+)" ignoreCase="true" negate="false" /> 
       </conditions> 
       <action type="Redirect" url="{C:1}" appendQueryString="true" /> 
      </rule> 
     </rules> 
    </rewrite> 

试图打开url http://localhost/tvb/http://localhost/tvb/?a=b会返回404错误,而不是将我重定向到http://localhost/tv(带或不带查询字符串)。

我在这里找到类似的帖子在stackoverflow上,我已经尝试了他们推荐的内容:回收应用程序池,重新启动IIS服务,用URL和/或REQUEST_FILENAME替换REQUEST_URI,但这些更改都没有改变。

任何人都可以看到我错了哪里?

好吧,我设法找到了这个自己的解决方案,所以这里就是我所做的:

首先,它似乎RewriteMap指令不支持正则表达式,所以这不起作用:

<add key="^tvb/" value="/tv/" /> 

相反,它必须是这样的:

<add key="/tvb/" value="/tv/" /> 

此外,似乎IIS7 REQUEST_URI变量已经改变行为,因为URL重写2.0模块(和文档)被释放。

此前,REQUEST_URI只包含url的路径,没有域和查询字符串。

现在,显然REQUEST_URI在IIS7的工作方式类似于一个在Apache中,也就是说,它包含查询字符串一样,所以难怪这部分不工作:

<add input="{StaticRedirects: {REQUEST_URI}}" ... /> 

,而不是我不得不将其更改为这个:

<add input="{StaticRedirects: {SCRIPT_NAME}}" ... /> 

现在重定向工作,无论是有和没有查询字符串!

希望这可以帮助别人。

刚在服务器上发现这个错误:IIS Rewrite, rewrite maps and query strings

我有同样的问题,并用PATH_INFO替换REQUEST_URI修复了问题。

这里是链接https://forums.iis.net/post/1883056.aspx

推理: “这是因为REQUEST_URI包含整个请求的URL包含查询字符串。由于重写映射中的键不包含查询字符串,因此映射查找失败。