IIS URL重写模块重复查询字符串

时间:2018-01-26 07:09:33

标签: url-rewrite-module

我有此规则,将所有HTTP流量重定向到HTTPS:

<rewrite>
    <rules>
        <rule name="RedirectToHttps" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
            <match url="*" negate="false" />
            <conditions logicalGrouping="MatchAny">
                <add input="{HTTPS}" pattern="off" />
            </conditions>
            <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Found" />
        </rule>
    </rules>
</rewrite>

我在互联网上找到了它。

它适用于没有查询字符串的简单URL。但它复制了查询字符串。例如,http://example.com/path?key=value变为https://example.com/path?key=value&key=value

这会导致调试和故障排除问题。是什么导致了这种行为?

1 个答案:

答案 0 :(得分:5)

问题是变量REQUEST_URI包含URL和查询字符串。在您的情况下,您有两个解决方案:

1)为您的操作添加属性appendQueryString="false"。规则应该是这样的:

<rule name="RedirectToHttps" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
    <match url="*" negate="false" />
    <conditions logicalGrouping="MatchAny">
        <add input="{HTTPS}" pattern="off" />
    </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" appendQueryString="false" redirectType="Found" />
</rule>

2)而是REQUEST_URI您可以使用URL变量,因为此变量仅包含不带查询字符串的URL。规则应该是这样的:

<rule name="RedirectToHttps" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
    <match url="*" negate="false" />
    <conditions logicalGrouping="MatchAny">
        <add input="{HTTPS}" pattern="off" />
    </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}{URL}" redirectType="Found" />
</rule>