IIS 7重写 - 我可以摆脱“页面包含安全和非安全的项目吗?”

时间:2011-11-02 06:45:40

标签: iis-7 url-rewriting

我想知道是否有人编写了一个IIS 7 RE-WRITE规则来摆脱这个错误。基本上,我希望如果页面包含“https://”,页面上所有包含的文件将被重写为“https://”。理论上应该摆脱错误,纠正吗?

2 个答案:

答案 0 :(得分:1)

有趣的想法。我没有把它用于那个。但它肯定是可能的,虽然它增加了一些处理响应的开销。此外,您将无法使用GZIP压缩(我已包含该设置)。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <outboundRules>
                <rule name="Force HTTPS links when using HTTPS" preCondition="Only for HTML" stopProcessing="false">
                    <match filterByTags="A, Area, Base, Form, Frame, IFrame, Img, Input, Link, Script" pattern="^http://(.*)" />
                    <action type="Rewrite" value="https://{R:1}" />
                    <conditions>
                        <add input="{HTTPS}" pattern="^ON$" />
                    </conditions>
                </rule>
                <preConditions>
                    <preCondition name="Only for HTML">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
                    </preCondition>
                </preConditions>
            </outboundRules>
        </rewrite>
        <urlCompression doStaticCompression="false" doDynamicCompression="false" />
    </system.webServer>
</configuration>

更新:

支持CSS文件中外部图像的链接可以通过添加规则以非常类似的方式处理。但请注意,这是一项非常昂贵的CPU任务,因为它需要URL Rewrite模块将整个CSS文件与正则表达式匹配,直到找不到匹配为止。

但是为了它的乐趣,我添加了一个额外的规则,它也将替换CSS链接到CSS文件中的图像:

<outboundRules>
    <rule name="Force HTTPS links when using HTTPS" preCondition="Only for HTML" stopProcessing="false">
        <match filterByTags="A, Area, Base, Form, Frame, IFrame, Img, Input, Link, Script" pattern="^http://(.*)" />
        <action type="Rewrite" value="https://{R:1}" />
        <conditions>
            <add input="{HTTPS}" pattern="^ON$" />
        </conditions>
    </rule>
    <rule name="Force HTTPS in CSS when using HTTPS" preCondition="Only for CSS">
        <match filterByTags="None" pattern="url\(('|&quot;){0,1}http://(.*?)('|&quot;){0,1}\)" />
        <action type="Rewrite" value="url({R:1}https://{R:2}{R:3})" />
        <conditions>
            <add input="{HTTPS}" pattern="^ON$" />
        </conditions>
    </rule>
    <preConditions>
        <preCondition name="Only for HTML">
            <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
        </preCondition>
        <preCondition name="Only for CSS">
            <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/css" />
        </preCondition>
    </preConditions>
</outboundRules>

答案 1 :(得分:0)

在HTML中使用"protocol-relative" URLs可能要容易得多。