Apache反向代理HTTPS转HTTP时混合内容问题求助
Apache反向代理HTTPS转HTTP时混合内容问题求助
嘿,这个问题我之前踩过坑,其实用Apache自带的模块就能轻松解决,不用折腾内部站点的代码~
首先你得先确认mod_substitute和mod_headers这两个模块已经启用,不同系统启用方式略有不同:
- 如果你用的是Ubuntu/Debian系列,直接在终端跑这两条命令:
a2enmod substitute headers systemctl restart apache2
- 要是CentOS/RHEL的话,就去编辑httpd.conf或者modules目录下的配置文件,把这两个模块的注释去掉,再重启httpd服务就行。
接下来修改你的VirtualHost配置,加上关键的几行规则:
<VirtualHost *:443> ServerName external.domain ServerAlias www.external.domain ProxyRequests Off SSLProxyEngine on SSLProxyVerify none SSLProxyCheckPeerCN off SSLProxyCheckPeerName off SSLProxyCheckPeerExpire off # 告诉内部站点当前是HTTPS请求,很多框架会自动根据这个生成正确的HTTPS链接 RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-Port "443" # 直接替换响应内容里的HTTP资源地址为HTTPS AddOutputFilterByType SUBSTITUTE text/html text/css text/javascript application/javascript Substitute "s|http://internal.domain|https://external.domain|ni" ProxyPass / http://internal.domain/ ProxyPassReverse / http://internal.domain/ # 处理Cookie的域名和路径,避免登录状态异常 ProxyPassReverseCookieDomain internal.domain external.domain ProxyPassReverseCookiePath / / <various ssl cert stuff> </VirtualHost>
给你简单拆解下这些配置的作用:
X-Forwarded-Proto和X-Forwarded-Port:如果内部站点是用PHP、Python这类框架开发的,它们大多能识别这些请求头,直接生成HTTPS的资源链接,从根源上解决问题。mod_substitute:要是内部站点不支持识别转发头,这个模块会在返回给客户端的响应里,自动把所有http://internal.domain替换成https://external.domain,浏览器拿到的就是安全的HTTPS资源地址了。- 最后的Cookie相关配置:确保代理后的Cookie域名和路径和外部站点匹配,避免出现登录后又跳回未登录状态的奇怪问题。
改完配置重启Apache,再去访问站点看看,混合内容的警告应该就消失啦!
备注:内容来源于stack exchange,提问作者Smock
相关产品推荐
相关产品推荐

