无法获取静态重定向以使用IIS Url Rewrite 2.0

pet*_*er3 1 iis-7 url-rewriting

运行以下IIS URL在本地重写设置,无法使其工作(从web.config):

        <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>
Run Code Online (Sandbox Code Playgroud)

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

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

谁能看到我哪里出错了?

pet*_*er3 5

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

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

<add key="^tvb/" value="/tv/" />
Run Code Online (Sandbox Code Playgroud)

相反,它必须是这样的:

<add key="/tvb/" value="/tv/" />
Run Code Online (Sandbox Code Playgroud)

此外,自Url Rewrite 2.0模块(和文档)发布以来,似乎IIS7 REQUEST_URI变量已更改行为.

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

现在,显然IIS7中的REQUEST_URI就像Apache中的那样工作,即它也包含查询字符串,所以难怪这部分不起作用:

<add input="{StaticRedirects: {REQUEST_URI}}" ... />
Run Code Online (Sandbox Code Playgroud)

相反,我不得不改变它:

<add input="{StaticRedirects: {SCRIPT_NAME}}" ... />
Run Code Online (Sandbox Code Playgroud)

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

希望这有助于某人.

刚刚在serverfault上找到了这个:IIS重写,重写地图和查询字符串.