问题的底部有一个TL; DR!
这里......
问题的背景(简单地说)是IIS Rewrite在重定向操作中删除了协议。因此,如果您未在<action type="Redirect" url="whatever"/>
中明确指定协议,则url="..."
的规则会从https转为http。{/ 1}}。
经过多次Google搜索后,我找到了 this article ,其中介绍了在重定向时保留协议的各种方法。对我来说最有效的方法如下:
url="https://{HOST}"
......出于以下两个原因就是这种情况:
维护协议需要多个规则。写下2个(一个仅用于http,另一个用于https)是不可行的。
此文件必须适用于直接SSL连接(其中{HTTP} = on)并与Cloudflare的灵活SSL兼容(其中{HTTP} =关闭但{HTTP_X-Forwarded-Proto}为“http”或“HTTPS”)。
SO,
我的想法是设置一个我可以用来对重写Map的变量。该变量的值取决于<rule name="Create HTTP_PROTOCOL">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{CACHE_URL}" pattern="^(.+)://" />
</conditions>
<serverVariables>
<set name="HTTP_PROTOCOL" value="{C:1}" />
</serverVariables>
<action type="None" />
</rule>
<rule name="Redirect to www" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="^localtest\.me$" />
</conditions>
<action type="Redirect" url="{HTTP_PROTOCOL}://www.localtest.me/{R:1}" />
</rule>
OR HTTPS=on
这是我的原始代码,它删除了协议:
HTTP_X-Forwarded-Proto=https
这是我的修改后的代码,无论是否存在直接的SSL连接,或者通过CloudFlare的灵活SSL进入连接,都会使用所需的协议进行重定向:
<!-- remove trailing slashes looses protocol -->
<rule name="RemoveTrailingSlashRule" stopProcessing="true">
<match url="(.*)/+$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Redirect" url="{R:1}" />
</rule>
除,
A)我得到一个空白页面,url重写失败,没有错误信息。
B)但是如果我删除了这个标签的两个实例,它就有效:
TL; DR 为什么这不起作用?
<!-- rewrite config -->
<rewrite>
<!-- rewrite maps -->
<rewriteMaps>
<rewriteMap name="RedirectBase">
<add key="http" value="http://{HTTP_HOST}/" />
<add key="https" value="https://{HTTP_HOST}/" />
</rewriteMap>
</rewriteMaps>
<!-- rewrite rules -->
<rules>
<!-- capture incoming protocol -->
<rule name="HTTP_PROTOCOL - Capture Default">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{CACHE_URL}" pattern="^(.+)://" />
</conditions>
<serverVariables>
<set name="HTTP_PROTOCOL" value="{C:1}" />
</serverVariables>
<action type="None" />
</rule>
<!-- overwrite protocol var if using CloudFlare's flexible SSL -->
<rule name="HTTP_PROTOCOL - Overwrite with CloudFlare header">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_X-Forwarded-Proto}" pattern="^https$" />
</conditions>
<serverVariables>
<set name="HTTP_PROTOCOL" value="{C:1}" replace="true" />
</serverVariables>
<action type="None" />
</rule>
<!-- remove trailing slashes but keep protocol -->
<rule name="RemoveTrailingSlashRule" stopProcessing="true">
<match url="(.*)/+$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Redirect" url="{RedirectBase:{HTTP_PROTOCOL}}{R:1}" />
</rule>
</rules>
</rewrite>
答案 0 :(得分:1)
找到了答案!
我必须在URL Rewrite config中手动添加“HTTP_PROTOCOL”到允许的服务器变量列表。这似乎只能通过IIS UI而不是通过web.config文件来完成。的 Full instructions here 强>