项目中使用了nginx作为前端反向代理服务器并用了https,但是发现问题:后端服务器用laravel的request获取的url协议变成了http。
原因很简单前端443反向代理到了后端80,理论上就应该是http。如何使后端laravel的request能获取前端https的url呢?根据request->url()源码可以看到决定http和https的是方法isSecure(),isSecure()方法用$trustedProxies作为判断依据,而$trustedProxies是用request静态方法setTrustedProxies()设置的,所以可以在index.php入口调用Request::setTrustedProxies()方法就可以了。第一个参数是信任ip地址的数组,第二个参数可以是Request::HEADER_X_FORWARDED_ALL,表示信任代理的所有header信息。
下面是header的一些例子,要想获得前端代理的协议信息,不要忘记设置X-Forwarded-Proto 。
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
这样已经把问题处理完成。后来发现laravel有个中间件,直接把$proxies设置一下反向代理的ip地址就可以了。
class TrustProx