You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:50:23