Angular 和 IIS。重定向到 HTTPS 并保留完整的 uRL

Angular 和 IIS。重定向到 HTTPS 并保留完整的 uRL

对于需要托管在 IIS 服务器上的 Angular 应用程序,我必须将完整的 URL 从 HTTP 重定向到 HTTPS。

我创建了以下规则,但它不起作用,它只适用于主域(如http://www.somedomain.com,它可以很好地重定向,但是http://www.somedomain.com/route

这是我的规则。我做错了什么?

<rules>
    <rule name="HTTP to HTTPS redirect" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
      </conditions>
      <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
    </rule>
    <rule name="Angular Routes" stopProcessing="true">
      <match url=".*" />
      <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
      </conditions>
      <action type="Rewrite" url="./index.html" />
    </rule>
</rules>

这个想法是重定向http://www.somedomain.com/route/something或者http://somedomain.com/route/somethinghttps://www.somedomain.com/route/something

答案1

有几种方法可以执行相同的重定向。如果您使用 url="https://{HTTP_HOST}/{R:1}",则必须添加 appendQueryString="true",否则不会附加 URI 路径。

因此配置应该如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="^OFF$" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

但我通常使用另一条 301 重定向规则,在某些情况下,浏览器可以更好地处理该规则。在这种情况下,您必须使用另一种类型的 uri:url="https://{HTTP_HOST}{REQUEST_URI}"

<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

你做得对,但 IIS 有自己的有线缓存,所以有时你不会立即看到更改,据我记得它以某种方式可以经受住 iisreset。此外,Google Chrome 被发现可以记住重定向。

因此建议稍等片刻或重新启动两台机器(我知道这听起来很疯狂)

这是我的工作配置。想法相同,但条件不同。

     <rules>
        <rule name="http to https" stopProcessing="true">
          <match url="(.*)" />
          <conditions>
            <add input="{SERVER_PORT}" pattern="443" negate="true" />
            <add input="{HTTP_HOST}" pattern="\.local$" negate="true" />
            <add input="{URL}" pattern="/robots.txt" negate="true" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" />
        </rule>
      </rules>

相关内容