启用 HTTP/3 <QUIC> 协议后 nginx PHP $_SERVER['HTTP_HOST'] 不存在,如果 PHP 代码又使用 HTTP_HOST 来确定网站链接,会导致 PHP 程序功能异常。- listen 443 ssl default_server;
- listen 443 quic default_server;
- listen [::]:443 ssl default_server;
- listen [::]:443 quic default_server;
- http3 on;
- http2 on;
复制代码- Array
- (
- [HTTPS] => on
- [REQUEST_SCHEME] => https
- [SERVER_PROTOCOL] => HTTP/3.0
- )
复制代码 而不使用 HTTP/3 协议访问理,PHP 可以正常拿到 $_SERVER['HTTP_HOST'] 的值。- Array
- (
- [HTTP_HOST] => wuxiancheng.cn
- [HTTPS] => on
- [REQUEST_SCHEME] => https
- )
复制代码 上面显示的内容只是 PHP $_SERVER 变量的一部分元素。
一个解决方法是修改 nginx 配置文件,人为显式传递 HTTP_HOST 给 PHP.
打开 fastcgi_params 这个文件
添加一行内容- fastcgi_param HTTP_HOST $host;
复制代码 如果 HTTPS 服务端口不是 443 需要带上端口号,否则会导致异常。- fastcgi_param HTTP_HOST $host:$server_port;
复制代码 也可以按以下方式配置实现自动加端口。
先在 nginx 主配置文件的 http {} 配置块中加入以下内容- map $server_port $fastcgi_http_host {
- 80 $host;
- 443 $host;
- default $host:$server_port;
- }
复制代码 然后在 fastcgi_params 中加入以下内容- fastcgi_param HTTP_HOST $fastcgi_http_host;
复制代码 重新启动一下 nginx 就可以解决 nginx HTTP/3 PHP $_SERVER 变量没有 HTTP_HOST 的问题了。
HTTP_HOST 来自 Host 请求头,值由客户端提供,存在一定的风险,客户端可以提供和服务器绑定的域名和端口不相同的其它域名和其它端口,后端程序不应该依赖 HTTP_HOST,最好不要使用 HTTP_HOST.
相关链接 nginx fastcgi_param |
|