使用https,$_SERVER['HTTPS']卻不等於on?


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM