欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

nginx + apache php 判断 https 无法得到https nginx负载转发源请求http/https:X-Forwarded-Proto及nginx中的转发报头 有大用 有大大用

今天在排查服务器的问题时最后定位到服务器因为经过了运维这一层的处理,转发过来的请求不管用户请求的是https还是http,我们的proxy服务器收到的都是80端口上的http。于是联系相关部门了解有没有现成的可用的这样一个字段来获得这个值。公司用的也是标准报头,即X-Forwarded-Proto。

    X-Forwarded-Proto(XFP)报头是用于识别协议HTTP或HTTPS的,即用户客户端实际连接到代理或负载均衡的标准报头。后端的服务器如果要确定客户端和负载平衡器之间使用的协议,可以使用X-Forwarded-Proto请求标头。nginx是支持读取非nginx标准的用户自定义header的,但是需要在http或者server下使用underscores_in_headers开启header的下划线支持,然后使用proxy_set_header向后端服务器发送字段X-Forwarded-Proto。

下面的内容是 nginx (比如 nginx.conf )配置文件的内容

#proxy_set_header上下文:http, server, location。语法:
proxy_set_header field value;
#默认值:	
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

#开启header的下划线支持:
underscores_in_headers on;
#设置向后端proxy发送X-Forwarded-Proto字段
proxy_set_header  X-Forwarded-Proto  $http_X_Forwarded_Proto;
proxy_set_header  X-Real-IP  $remote_addr;


    在后端的服务器,使用$http_X_Forwarded_Proto接收的,也可以使用小写比如$http_x_forwarded_proto来接收,前面都需要加上http_。


来自  http://www.04007.cn/article/770.html


HTTP_X_FORWARDED_PROTO

yii2 框架中根据 2 个值判断是不是 https ,如下:

isset($\_SERVER['HTTPS']) && (strcasecmp($\_SERVER['HTTPS'], 'on') === 0 || $\_SERVER['HTTPS'] == 1) ||
isset($\_SERVER['HTTP_X_FORWARDED_PROTO']) && strcasecmp($\_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') === 0;

其中 HTTPS 这个值比较好理解,直接查询服务器有没有配置过 HTTPS 就可以知道了。 但是, HTTP_X_FORWARDED_PROTO 这个值我就没看懂是什么意思,而且在网上查了蛮多资料,一般来说,是有设置过下面的值

proxy_set_header   X-Forwarded-Proto $scheme;

之后,才可以在 php 的 $_SERVER 中看到这个值,但是我们目前的服务器配置中并没有设置过这些内容,那么这个值是怎么来的呢?


来自  https://cloud.tencent.com/developer/article/1960731




普通分类: