Azure Http到Https重定向不适用于SPA

时间:2017-08-29 19:28:09

标签: azure ssl iis single-page-application azure-web-app-service

我正在尝试使用web.config重写规则在我们的Azure应用服务中启用http到https重定向。根据我能找到的所有文档,使用重写规则的web配置重定向是获得此功能的官方方式。我喜欢和想要支持的功能之一是gzip作为Accepted-Encoding,这是默认启用的。但这两个特征似乎有冲突。还有另一种方法可以进行重定向吗?我必须禁用压缩吗?

这是我的重定向规则:

<rule name="Redirect to https" stopProcessing="true">
    <match url="(.*)"/>
    <conditions logicalGrouping="MatchAny">
        <add input="{HTTPS}" pattern="Off"/>
    </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" appendQueryString="true" />
</rule>

使用我只希望通过SSL传递的内容响应的Curl命令:

curl "http://[MyUrl]/" -H "Accept-Encoding: gzip, deflate" --compressed

按预期执行的Curl命令:

curl "http://[MyUrl]/"

响应:

HTTP/1.1 301 Moved Permanently
Content-Length: 154
Content-Type: text/html; charset=UTF-8
Location: https://[MyUrl]/
Server: Microsoft-IIS/8.0
X-Powered-By: ASP.NET
Date: Tue, 29 Aug 2017 19:29:29 GMT

提前致谢。

如果这很有价值,根网址之外的请求似乎按预期工作。只有根网址似乎在没有重定向的情况下返回内容。

更新
我认为这可能与我的SPA重写规则有关,虽然我不确定干扰,因为第一个规则有stopProcessing。我能够在cdwredirecttest.azurewebsites.net重新创建该问题。如果您点击该网站,它会将您重定向到https,但仅限第一次。打开另一个浏览器并再试一次,这次它将通过http加载网站。在服务器缓存gzip响应后,您不再被重定向。这是我的完整web.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Redirect to https" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="true" />
                    <conditions logicalGrouping="MatchAny">
                        <add input="{HTTPS}" pattern="Off" ignoreCase="true"/>
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" appendQueryString="true" />
                </rule>
                <rule name="Redirect all requests">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
                    </conditions>
                    <action type="Rewrite" url="index.html" appendQueryString="true" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

2 个答案:

答案 0 :(得分:0)

根据您的描述,我遵循了您的网址重写规则,并在我的天蓝网络应用上进行了测试。我指定了-L选项,以使curl能够按照以下方式关注HTTP重定向:

curl "http://{your-webapp}.azurewebsites.net/" -L -H "Accept-Encoding: gzip, deflate" --compressed -v

curl "http://{your-webapp}.azurewebsites.net/home/index" -L -H "Accept-Encoding: gzip, deflate" --compressed -v

我可以使用上述命令中的Content-Encoding: gzip标头检索响应,如下所示:

enter image description here

enter image description here

答案 1 :(得分:0)

在挖掘并重新创建问题后,我向微软开了一张票。问题主要围绕单页应用程序和接受压缩内容时使用重写规则进行SSL重定向。显然,IIS正在缓存gzip响应,因此SSL重定向永远不会发生。解决方案是禁用缓存:

<system.webServer>
    ...
    <caching enabled="false" enableKernelCache="false"/>
    ...
</system.webServer>

这些是我提出的重新创建问题的步骤:

  1. 创建新的Azure App服务
  2. 将hostingstart.html重命名为index.html(除非重写规则以后使用它,否则可能没有必要)
  3. 添加以下web.config

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.webServer>
            <rewrite>
                <rules>
                    <rule name="Redirect to HTTPS" stopProcessing="true">
                        <match url="^(.*)$" ignoreCase="true" />
                        <conditions logicalGrouping="MatchAny">
                            <add input="{HTTPS}" pattern="Off" ignoreCase="true"/>
                        </conditions>
                        <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" appendQueryString="true" />
                    </rule>
                    <rule name="Single Page App">
                        <match url="^(.*)$" ignoreCase="false" />
                        <conditions logicalGrouping="MatchAll">
                            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
                        </conditions>
                        <action type="Rewrite" url="index.html" appendQueryString="true" />
                    </rule>
                </rules>
            </rewrite>
        </system.webServer>
    </configuration>
    
  4. 将http网站加载到卷曲中。这将导致重定向响应按预期发生。

    curl "http://cdwredirecttest.azurewebsites.net" -H "Accept-Encoding: gzip, deflate" --compressed
    
  5. 以curl加载https网站。您将按预期获得页面内容(我相信IIS正在缓存此gzip响应并在以后使用它。)

    curl "https://cdwredirecttest.azurewebsites.net" -H "Accept-Encoding: gzip, deflate" --compressed
    
  6. 将http网站加载到卷曲中。如果您收到重定向响应,则需要重复5和6.最终,响应将返回内容。

    curl "http://cdwredirecttest.azurewebsites.net" -H "Accept-Encoding: gzip, deflate" --compressed
    
  7. 现在加载尚未缓存重定向响应的Web浏览器。您将通过http加载网站,而不是重定向到https。

  8. 只要IIS放弃缓存响应,您就可以使用curl查看重定向,然后重复5和6以使应用再次进入失败状态。