使用https,$_SERVER['HTTPS']却不等于on?

目前有两台服务器,都是http和https协议共存。

但是部分程序遇到一些问题,因为PHP中有根据$_SERVER['HTTPS']来设置环境常量。

一台服务器可以拿到值为on,另外一台却是NULL

一步步排查后才知道,这是个 fastcgi 配置的问题!

解决方法的办法就是Nginx配置加上:

fastcgi_param HTTPS $https if_not_empty;

完整配置如下:

location ~ .*\.(php|php5)?$
{
	try_files $uri =404;
	fastcgi_pass  unix:/tmp/php-cgi.sock;
	fastcgi_param HTTPS $https if_not_empty;
	fastcgi_index index.php;
	include fastcgi_params;
}

很多人认为使用

fastcgi_param HTTPS on;

这样是没错啦,不过强迫使用这个参数,不太有效哦!

最好的答案就(参考下面 nginx 官方的链接)

fastcgi_param HTTPS $https if_not_empty;

有 https 协议时才自动使用 https on,否则忽略这个参数。

  • $https:如果链接是 SSL 就返回 ON,否则返回空字符串。
  • if_not_empty:当参数有值时才传递到服务器

注意:这个 if_not_empty 额外参数只适合 Nginx 1.1.11 之后的版本

 

参考地址:

  1. Nginx:普通的HTTP请求被发送到HTTPS端口
  2. FastCGI application behind NGINX is unable to detect that HTTPS secure connection is used

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *