目前有两台服务器,都是http和https协议共存。
但是部分程序遇到一些问题,因为PHP中有根据$_SERVER['HTTPS']
来设置环境常量。
一台服务器可以拿到值为on
,另外一台却是NULL
。
一步步排查后才知道,这是个 fastcgi 配置的问题!
解决方法的办法就是Nginx配置加上:
fastcgi_param HTTPS $https if_not_empty;
完整配置如下:
location ~ \.php$ { fastcgi_pass 127.0.0.1:9012; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS $https if_not_empty;
}
很多人认为使用
fastcgi_param HTTPS on;
这样是没错,但要注意,按我理解,这样也会导致一个问题。因为这种方式属于写死环境变量,在此环境变量生效的区域,服务器无法判断是http请求还是https请求。
最好的答案就(参考下面 nginx 官方的链接)
fastcgi_param HTTPS $https if_not_empty;
有 https 协议时才自动使用 https on
,否则忽略这个参数。
-
$https
:如果链接是 SSL 就返回ON
,否则返回空字符串。 -
if_not_empty
:当参数有值时才传递到服务器
注意:这个 if_not_empty
额外参数只适合 Nginx 1.1.11 之后的版本