【问题标题】:How to configure mod_pagespeed for SSL pages如何为 SSL 页面配置 mod_pagespeed
【发布时间】:2012-12-31 14:58:48
【问题描述】:

我们有网站,例如http://www.acb.com 指向一个硬件负载平衡器,假设负载平衡两个专用服务器。每个服务器都运行 apache 作为前端,并使用 mod_proxy 将请求转发到 tomcat。

我们网站的某些页面需要 SSL,例如 https://www.abc.com/loginhttps://www.abc.com/checkout

SSL 在硬件负载平衡器处终止。

当我配置 mod_pagespeed 时,它会压缩、最小化和合并 css 文件,并使用绝对 url http://www.abc.com/css/merged.pagespeedxxx.css 而不是相对 url /css/merged.pagespeedxxx.css 重写它们。

它适用于非 ssl 页面,但是当我导航到诸如 https://www.abc.com/login 之类的 ssl 页面时,所有 css 和 js 文件都被 chrome 等浏览器阻止,因为它们的绝对 URL 不使用 ssl。

我该如何解决这个问题?

【问题讨论】:

    标签: apache tomcat mod-pagespeed


    【解决方案1】:

    在此documentationthis one 中检查https 字符串。

    您应该在问题中向我们展示您当前的ModPagespeedMapOriginDomain && ModPagespeedDomain 设置。

    根据我从这些方面的理解:

    origin_specified_in_html可以指定https,而origin_to_fetch_from只能指定http,例如

    ModPagespeedMapOriginDomain http://localhost https://www.example.com

    该指令允许服务器接受 www.example.com 的 https 请求,而不需要 SSL 证书来获取资源 - 事实上,这是 mod_pagespeed 可以服务 https 请求的唯一方式目前它不能使用 https 来获取资源。例如,给定上述映射,并假设 Apache 配置为支持 https,mod_pagespeed 将获取和优化使用 https://www.example.com 访问的资源,从 http://localhost 获取资源,这可以是同一个 Apache 进程或不同的服务器进程。

    还有这些:

    mod_pagespeed 为通过 https 提供内容的网站提供有限的支持。有两种机制可以配置 mod_pagespeed 来服务 https 请求:

    • 使用 ModPagespeedMapOriginDomain 将 https 域映射到 http 域。
    • 使用 ModPagespeedLoadFromFile 将本地可用目录映射到 https 域。

    解决方案是这样的(或带有ModPagespeedLoadFromFile 的解决方案)

    ModPagespeedMapOriginDomain http://localhost https://www.example.com
    

    但是,对你来说真正的问题是 apache 不直接接收 HTTPS 请求,因为硬件负载均衡器自己处理它。所以 mod-pagespeed 输出过滤器甚至不知道它是为 SSL 域请求的。而且当它修改HTML内容时,可能应用域重写,它无法处理https的情况。

    所以...一个解决方案(未经测试)将在 apache 服务器上使用另一个虚拟主机,如果您愿意,仍然是 HTTP,专用于 https 处理。所有与 https 相关的 url (/login,/checkout,...) 都会被硬件负载均衡器重定向到这个特定的域名。假设http://secure.acb.com。此名称仅在负载均衡器和前端 apache 之间使用(当然 apache 应该限制对这个 VH 的访问仅限于负载均衡器)。

    然后在这些http://secure.acb.com 虚拟主机中,mod_pagespeed 将被配置为在外部将域重写为https://www.example.com。比如:

    ModPagespeedMapOriginDomain http://secure.example.com https://www.example.com
    

    最终用户请求是https://www.example.com/login,负载均衡器管理HTTPS,与http://secure.example.com 的apache 对话,页面结果只包含对https://www.example.com/* 资产的引用。现在,当使用 https 域请求请求这些资产时,您仍然会遇到提供这些资产的问题。因此,硬件负载均衡器应该允许 https 域中的所有这些资产 url 并将它们发送到 http://secure.abc.com 虚拟主机(或任何其他静态 VH)。

    【讨论】:

    • 感谢您的详细回答:)
    • @Hussain 你测试过 Olaf Kock 的解决方案吗?值得一试。
    • 我知道 Olaf Kock 解决方案,但绝对 url 是由 mod_pagespeed 生成的,它自己无法删除 http://
    • 如果您在浏览器和 HTTPS 上遇到不安全的 HTTP 请求错误,在配置中设置 ModPagespeedMapOriginDomain 和 ModPagespeedMapRewriteDomain 将解决这些问题。
    • 喜欢你的处理方式!我喜欢答案不仅仅是文档的一些复制粘贴,而是深入的解释 + 奖励积分以获得独特的可能解决方案!
    【解决方案2】:

    这听起来像是您自己将重写的 URL 配置为 http://www.abc.com/css/merged.pagespeedxxx.css - 因此:尝试使用相对协议的 URL,例如删除 http: 并仅声明 //www.abc.com/css/merged.pagespeedxxx.css - 这将使用与请求嵌入页面相同的协议。

    URL 的标准化但相对未知的特性之一

    【讨论】:

    • 来自Paul Irish: Caveat: When used on a <link> or @import for a stylesheet, IE7 and IE8 download the file twice. All other uses, however, are just fine.
    • ouch - 很好的发现和易于阅读的文章(包括链接的微软博客解释根本原因)。如果这个简单的标准功能能够完美运行,那就太好了。我希望不久之后它会在 100% 的情况下发挥作用。
    • @Olarf 这是我们当前使用 css 和 js 文件的方式.. 但是 mod_pagespeed 用绝对路径重写它 http://
    猜你喜欢
    • 2011-05-05
    • 2014-07-28
    • 2013-12-03
    • 2015-02-09
    • 2013-12-27
    • 2016-05-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多