当前位置: 代码迷 >> 综合 >> 处理laravel配置nginx反向代理https后获取request的url变成http问题
  详细解决方案

处理laravel配置nginx反向代理https后获取request的url变成http问题

热度:2   发布时间:2024-01-26 13:17:56.0

项目中使用和了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 TrustProxies extends Middleware
{/*** The trusted proxies for this application.** @var array|string*/protected $proxies = ['127.0.0.1'];/*** The headers that should be used to detect proxies.** @var int*/protected $headers = Request::HEADER_X_FORWARDED_ALL;
}

如果不知道ip,或者ip一直变动可以设置所有的ip可信任

protected $proxies = '**';
  相关解决方案