IIS 将同一 IIS 上的相同域名的 HTTP 重定向到 HTTPS
IIS Redirect HTTP to HTTPS for same domain names on the same IIS
我有一个特例:
同一个 IIS 上有站点:
sub.domain.com - 它在 80 上有 http,在 443 上有 https。它非常适合从 http 到 https
的重定向方式
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="HTTPS force" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}"
redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
http://sub.domain.com:5000 and https//sub.domain.com:5001. That one just refuses to pass from http to https to the right port. It can direct from http://sub.domain.com:5000 to https://sub.domain.com:5000 instead of https://sub.domain.com:5001. Unless we clear the browsing data then it only works one time from http://sub.domain.com:5000 to https://sub.domain.com:5001。规则喜欢
<rule name="HTTP to HTTPS on different SSL Port" enabled="true" stopProcessing="true">
<match url="(.*)" ignoreCase="true" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true">
<add input="{HTTPS}" pattern="off" />
<add input="{HTTP_HOST}" pattern="([^/:]*?):[^/]*?" />
</conditions>
<action type="Redirect" url="https://{C:1}:5001/{R:0}" appendQueryString="false" />
</rule>
所以我的问题是如何在不清除浏览数据等的情况下成功重定向 http://sub.domain.com:5000 to https://sub.domain.com:5001?
更新:
在我记录失败的请求日志后,我发现了一些东西。
我在 FailedReqLogFiles\W3SVC4
中有 18 个文件。他们每个人都有不同的 requestURL。
- 第一个是
http://somedomain.com:5000/
,状态码301;
- 第二个是
https://somedomain.com:5001/
,状态码200。
- 第三个是
https://somedomain.com:5001/inline.e576fger98965b3219.bundle.js
,状态码200。
- 第四个是
https://somedomain.com:5001/polyfills.3bed24531fd9085545fdw.bundle.js
,状态码200。
- 等......
- 最后一位(第18位)是
https://somedomain.com:5001/assets/images/action,jpg
。
如果我查看请求详细信息中的 GENERAL_ENDPOINT_INFORMATION 节点 Tab.It 在每个日志文件中显示 Failed To Complete
。
重要提示:
这是 .net 核心加上 angular 应用程序。我不确定我是否应该在 angular 端配置 ssl 并重定向 https,而不是在 IIS 或两侧?
您可以尝试以下规则:
<rule name="HTTP to HTTPS on different SSL Port" enabled="true" stopProcessing="true">
<match url="(.*)" ignoreCase="true" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true">
<add input="{HTTPS}" pattern="off" />
<add input="{SERVER_PORT}" pattern="^2000$" />
<add input="{HTTP_HOST}" pattern="([^/:]*?):[^/]*?" />
</conditions>
<action type="Redirect" url="https://{C:1}:2001/{R:1}" appendQueryString="false" />
</rule>
注意:根据您的站点绑定和要求以模式设置端口号。
另外,尝试设置 iis 客户端缓存设置。
https://docs.microsoft.com/en-us/iis/configuration/system.webserver/staticcontent/clientcache
经过几天的奋斗。终于找到解决办法了。
我必须做两件事。
在 IIS 上应用规则
<rule name="HTTP to HTTPS on different SSL Port" enabled="true" stopProcessing="true">
<match url="(.*)" ignoreCase="true" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true">
<add input="{HTTPS}" pattern="off" />
<add input="{HTTP_HOST}" pattern="([^/:]*?):[^/]*?" />
</conditions>
<action type="Redirect" url="https://{C:1}:5001/{R:0}" appendQueryString="false" />
从 .net 核心代码中删除 HSTS。我有代码
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHsts();
删除它然后工作。感谢@StanislavBerkov
我有一个特例: 同一个 IIS 上有站点:
sub.domain.com - 它在 80 上有 http,在 443 上有 https。它非常适合从 http 到 https
的重定向方式<configuration> <system.webServer> <rewrite> <rules> <rule name="HTTPS force" enabled="true" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="^OFF$" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
http://sub.domain.com:5000 and https//sub.domain.com:5001. That one just refuses to pass from http to https to the right port. It can direct from http://sub.domain.com:5000 to https://sub.domain.com:5000 instead of https://sub.domain.com:5001. Unless we clear the browsing data then it only works one time from http://sub.domain.com:5000 to https://sub.domain.com:5001。规则喜欢
<rule name="HTTP to HTTPS on different SSL Port" enabled="true" stopProcessing="true"> <match url="(.*)" ignoreCase="true" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="true"> <add input="{HTTPS}" pattern="off" /> <add input="{HTTP_HOST}" pattern="([^/:]*?):[^/]*?" /> </conditions> <action type="Redirect" url="https://{C:1}:5001/{R:0}" appendQueryString="false" /> </rule>
所以我的问题是如何在不清除浏览数据等的情况下成功重定向 http://sub.domain.com:5000 to https://sub.domain.com:5001?
更新:
在我记录失败的请求日志后,我发现了一些东西。
我在 FailedReqLogFiles\W3SVC4
中有 18 个文件。他们每个人都有不同的 requestURL。
- 第一个是
http://somedomain.com:5000/
,状态码301; - 第二个是
https://somedomain.com:5001/
,状态码200。 - 第三个是
https://somedomain.com:5001/inline.e576fger98965b3219.bundle.js
,状态码200。 - 第四个是
https://somedomain.com:5001/polyfills.3bed24531fd9085545fdw.bundle.js
,状态码200。 - 等......
- 最后一位(第18位)是
https://somedomain.com:5001/assets/images/action,jpg
。
如果我查看请求详细信息中的 GENERAL_ENDPOINT_INFORMATION 节点 Tab.It 在每个日志文件中显示 Failed To Complete
。
重要提示:
这是 .net 核心加上 angular 应用程序。我不确定我是否应该在 angular 端配置 ssl 并重定向 https,而不是在 IIS 或两侧?
您可以尝试以下规则:
<rule name="HTTP to HTTPS on different SSL Port" enabled="true" stopProcessing="true">
<match url="(.*)" ignoreCase="true" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true">
<add input="{HTTPS}" pattern="off" />
<add input="{SERVER_PORT}" pattern="^2000$" />
<add input="{HTTP_HOST}" pattern="([^/:]*?):[^/]*?" />
</conditions>
<action type="Redirect" url="https://{C:1}:2001/{R:1}" appendQueryString="false" />
</rule>
注意:根据您的站点绑定和要求以模式设置端口号。
另外,尝试设置 iis 客户端缓存设置。
https://docs.microsoft.com/en-us/iis/configuration/system.webserver/staticcontent/clientcache
经过几天的奋斗。终于找到解决办法了。
我必须做两件事。
在 IIS 上应用规则
<rule name="HTTP to HTTPS on different SSL Port" enabled="true" stopProcessing="true"> <match url="(.*)" ignoreCase="true" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="true"> <add input="{HTTPS}" pattern="off" /> <add input="{HTTP_HOST}" pattern="([^/:]*?):[^/]*?" /> </conditions> <action type="Redirect" url="https://{C:1}:5001/{R:0}" appendQueryString="false" />
从 .net 核心代码中删除 HSTS。我有代码
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseHsts();
删除它然后工作。感谢@StanislavBerkov