8

我们有一个网站,例如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。

我该如何解决这个问题?

4

2 回答 2

8

检查本文档https文档中的字符串。

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

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

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

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

该指令允许服务器在不需要 SSL 证书来获取资源的情况下接受www.example.com的 https 请求 -事实上,这是 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.commod_pagespeed 将被配置为从外部将域重写为https://www.example.com. 就像是:

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

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

于 2013-01-25T09:06:59.083 回答
1

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

URL 的标准化但相对未知的功能之一

于 2013-01-23T21:30:49.127 回答