使用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 之后的版本

上一篇:Nginx工作原理及相关介绍


下一篇:【Android】 tools:context【转】