无法获取静态重定向以与 IIS URL 重写 2.0 一起使用



在本地运行以下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>

尝试打开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/" />

而且,自从Url Rewrite 2.0模块(和文档)发布以来,IIS7 REQUEST_URI变量似乎已经改变了行为。

以前,REQUEST_URI只包含url的路径,不包含域和查询字符串。

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

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

我必须改成这样:

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

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

希望这能帮助到一些人。

刚刚在serverfault: IIS重写,重写映射和查询字符串上发现了这个。

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

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

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

最新更新