目前有兩台服務器,都是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 之后的版本