IIS 7.5应用程序初始化(预热)和HTTPS

6
我们一直在使用IIS 7.5的应用程序初始化模块,而且一直运行得非常完美。但是,我们刚刚开始实施SSL,似乎与预热功能产生了冲突。我已经做了很多研究,但迄今为止没有解决方案。基本上问题在于初始化模块不遵循重定向。我们必须保持http对站点的某个部分启用,但我们确实将所有其他HTTP访问重定向到其HTTPS等效项。我使用重写规则解决了这个问题,它会将302抛出到https页面。初始化收到此302,但只是忽略它。我尝试过的解决方案有:APP_WARMING_UP服务器变量,更改初始化页面为HTTPS版本。当前配置如下:
    <applicationInitialization remapManagedRequestsTo="Warmup.htm" skipManagedModules="true" doAppInitAfterRestart="true">
        <add initializationPage="/WarmUp?id=1" />
    </applicationInitialization>

我尝试将URL更改为“https://{HTTP_HOST}/Login/WarmUp?id=1”,甚至用绝对地址替换了{HTTP_HOST},但这两种配置似乎完全禁用了应用程序初始化。它甚至不再发出页面请求。
这是该模块的文档:

http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-application-initialization

这是我的重写规则,基本上是整个事件的罪魁祸首。它是唯一的规则。
<rule name="HTTP to HTTPS redirect" enabled="true" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{APP_WARMING_UP}" pattern="1" negate="true" />
        <add input="{REQUEST_URI}" pattern="/services" negate="true" />
        <add input="{HTTPS}" pattern="off" />
    </conditions>
    <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" logRewrittenUrl="true" />
    <serverVariables>
        <set name="SKIP_MANAGED_MODULES" value="0" />
    </serverVariables>
</rule>

有人能帮忙吗?

2个回答

12

这个可能有帮助。该模块似乎无法与要求SSL的网站一起使用。请参见此 KB 问题。我猜测该模块启动了一个 http 请求而不是 https。

您可能需要创建一个允许 http 并且不重定向到 https 的页面。


这太完美了!他们的解决方案基本上是我的 APP_WARMING_UP,但是他们通过测试用户代理和源 IP 来检测应用程序初始化模块。我应该想到这一点。(所以我不需要制作一个接受 HTTP 请求的页面来清除缓存。我只需要更改重写规则即可。)这也确认了 {APP_WARMING_UP} 在 IIS 7.5 上无法工作。他们应该把这个添加到他们的文档中。 - user2820217
你的新重写规则是什么? - Mike Flynn

2

如果其他人在以后查看此内容,我认为解决方案是添加一个重写规则来检测用户代理是否匹配“初始化”,并仅允许通过此路由。

这个规则必须在重定向到https规则之前。这在链接中已经解释了,但我也会在这里发布:

<rewrite>
    <rules>
        <rule name="No redirect on warmup request (request from localhost with warmup user agent)"
        stopProcessing="true">
            <match url=".*" />
            <conditions>
                <add input="{HTTP_HOST}" pattern="localhost" />
                <add input="{HTTP_USER_AGENT}" pattern="Initialization" />
            </conditions>
            <action type="Rewrite" url="{URL}" />
        </rule>
        <rule name="HTTP to HTTPS redirect for all requests" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{HTTPS}" pattern="off" />
            </conditions>
            <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" />
        </rule>
    </rules>
</rewrite>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接