Symfony项目同时部署HTTP/HTTPS及HTTPS下URI返回HTTP问题修复
原因分析
- Symfony默认通过
REQUEST_SCHEME、SERVER_PORT等原生服务器变量判断请求协议,从你提供的参数可以看到REQUEST_SCHEME值为http、SERVER_PORT值为80,因此Symfony判定当前为HTTP请求,生成的URL自然使用HTTP协议。 - 请求存在HTTPS卸载逻辑:
HTTP_X_FORWARDED_PROTO值为https说明用户端确实是HTTPS访问,但请求经过了反向代理/负载均衡/CDN的HTTPS卸载,代理将请求以HTTP协议转发到后端Apache的80端口,因此后端Apache拿到的请求本身是HTTP协议。 - Symfony默认不信任
X-Forwarded-Proto这类代理转发头,不会主动读取该头判断真实请求协议,导致协议识别错误。
修复方案
方案1:配置Symfony信任代理头(适用于存在反向代理的场景)
根据你使用的Symfony版本选择对应配置:
- Symfony 5及以上版本,修改
config/packages/framework.yaml:
framework: # 填写实际反向代理服务器的IP段,多个用逗号分隔 trusted_proxies: '127.0.0.1,::1' trusted_headers: ['x-forwarded-for', 'x-forwarded-host', 'x-forwarded-proto', 'x-forwarded-port']
- Symfony 3/4版本,修改入口文件
web/app.php(或public/index.php),在Request::createFromGlobals()代码之前添加:
<?php // 第一个参数填写实际反向代理服务器的IP段 Request::setTrustedProxies( ['127.0.0.1', '::1'], Request::HEADER_X_FORWARDED_ALL );
方案2:Apache侧配置强制HTTPS标识(适用于无反向代理、直接用Apache提供HTTPS服务的场景)
在你现有的443端口虚拟主机配置中添加以下两行,重启Apache即可:
<VirtualHost *:443> # 原有配置保持不变,新增以下内容 SetEnvIf HTTPS On HTTPS=on SetEnv REQUEST_SCHEME https </VirtualHost>
方案3:全局强制生成HTTPS链接(兜底方案)
直接在Symfony路由配置中强制所有生成的URL使用HTTPS协议,修改config/packages/routing.yaml:
framework: router: # 替换为你的实际站点域名 default_uri: 'https://project.domain.net' https_require: true
内容的提问来源于stack exchange,提问作者Kioko Kiaza
相关产品推荐
相关产品推荐

