IIS 将同一 IIS 上的相同域名的 HTTP 重定向到 HTTPS

IIS Redirect HTTP to HTTPS for same domain names on the same IIS

我有一个特例: 同一个 IIS 上有站点:

  1. 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>
    
  2. 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。

  1. 第一个是http://somedomain.com:5000/,状态码301;
  2. 第二个是https://somedomain.com:5001/,状态码200。
  3. 第三个是https://somedomain.com:5001/inline.e576fger98965b3219.bundle.js,状态码200。
  4. 第四个是https://somedomain.com:5001/polyfills.3bed24531fd9085545fdw.bundle.js,状态码200。
  5. 等......
  6. 最后一位(第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

经过几天的奋斗。终于找到解决办法了。

我必须做两件事。

  1. 在 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" />
    
  2. 从 .net 核心代码中删除 HSTS。我有代码

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
           app.UseHsts();
    

删除它然后工作。感谢@StanislavBerkov