我有此规则,将所有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
。
这会导致调试和故障排除问题。是什么导致了这种行为?
答案 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>