Apache2反向代理Docker容器时HTTP转HTTPS失效,PHP表单URL异常
解决表单返回HTTP URI而非HTTPS的问题
问题根源
容器内的Apache与PHP不知道外部请求是通过HTTPS访问的——前端Apache反向代理时用HTTP协议和容器通信,导致PHP生成链接、表单action时默认使用HTTP协议。
解决步骤
1. 修改主机端Apache反向代理配置
在VirtualHost *:443块中添加HTTPS头传递配置,同时修正ProxyPassReverse规则,确保响应头中的HTTP地址被替换为HTTPS:
<VirtualHost *:443> ServerName demo.myapp.mydomain.com ServerAlias www.demo.myapp.mydomain.com SSLProxyEngine On ProxyRequests Off ProxyPreserveHost On # 新增:传递HTTPS协议标识给容器 RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-Port "443" <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://ip.ip.ip.ip:80/ # 修正:将响应中的HTTP地址替换为HTTPS域名 ProxyPassReverse / https://demo.myapp.mydomain.com/ ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /data/var/www/mydomain.com/data/certbot/conf/live/demo.mydomain.com/fullchain.pem SSLCertificateKeyFile /data/var/www/mydomain.com/data/certbot/conf/live/demo.mydomain.com/privkey.pem RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </VirtualHost>
2. 配置容器内的Apache与PHP
让容器识别前端传递的HTTPS标识,告知PHP当前为HTTPS请求:
- 启用容器内Apache的
remoteip和headers模块:a2enmod remoteip headers - 在容器的站点配置文件(如
000-default.conf)中添加:# 信任主机Apache的IP地址,替换为你的主机实际IP RemoteIPTrustedProxy 主机IP地址 # 根据X-Forwarded-Proto头设置HTTPS环境变量 SetEnvIf X-Forwarded-Proto "https" HTTPS=on # 确保PHP能获取到正确的协议头 Header set X-Forwarded-Proto "https" env=HTTPS - 若使用php-fpm,在容器的
php-fpm.conf或站点的fastcgi配置中添加:fastcgi_param HTTPS on; fastcgi_param HTTP_X_FORWARDED_PROTO https;
3. 重启服务生效
- 重启主机端Apache:
systemctl restart apache2 - 重启容器内的Apache和php-fpm:
service apache2 restart service php8.1-fpm restart
验证
刷新页面后提交表单,检查浏览器控制台的URI是否已变为HTTPS;也可通过phpinfo()查看HTTPS、HTTP_X_FORWARDED_PROTO变量是否被正确设置为on和https。
内容的提问来源于stack exchange,提问作者Attila
相关产品推荐
相关产品推荐

