Hus*_*din 9 apache tomcat mod-pagespeed
我们有网站,例如http://www.acb.com,它指向一个硬件负载均衡器,它假设负载均衡两个专用服务器.每个服务器都运行apache作为前端,并使用mod_proxy将请求转发给tomcat.
我们网站的某些页面需要SSL,如https://www.abc.com/login或https://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.
我该如何解决这个问题?
您应该在问题中向我们显示您当前的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
Run Code Online (Sandbox Code Playgroud)
但是,真正的问题是apache没有直接接收HTTPS请求,因为硬件负载均衡器自己处理它.因此mod-pagespeed输出过滤器甚至不知道它是为SSL域请求的.当它修改HTML内容时,可能会应用域重写,它无法处理https案例.
所以...一个解决方案(未经测试)将在apache服务器上使用另一个虚拟主机,如果需要,仍然是HTTP,专用于https处理.然后,所有与https相关的URL(/login,, /checkout...)将由硬件负载平衡器重定向到此特定域名.让我们说吧http://secure.acb.com.此名称仅在负载均衡器和前端apach之间使用(当然,apache应该仅限制对此VH的访问权限到负载均衡器).
然后在这些http://secure.acb.com虚拟主机中,mod_pagespeed将被配置为从外部重写域https://www.example.com.就像是:
ModPagespeedMapOriginDomain http://secure.example.com https://www.example.com
Run Code Online (Sandbox Code Playgroud)
最后,最终用户请求是https://www.example.com/login,负载均衡器管理HTTPS,与apache通信http://secure.example.com,页面结果仅包含对https://www.example.com/*资产的引用.现在,当使用https域请求请求这些资产时,您仍然有服务这些资产的问题.因此,硬件负载平衡器应该允许https域中的所有这些资产URL并将它们发送到http://secure.abc.com虚拟主机(或任何其他静态VH).