我在负载均衡器后面遇到了新的Laravel应用程序的问题。 我想让Laravel将Auth中间件302重定向到相对路径,如 / login ,而不是http://myappdomain.com / login 实际上正在进行。
我只在默认的.htaccess Laravel船上看到301重定向,这让我相信Laravel内部的行为是对的,我错了吗?
有人能指出我正确的方向吗?
答案 0 :(得分:1)
如果您需要在负载均衡器后面正确确定请求是否安全,则需要让框架知道您在代理后面。这将确保route()
和url()
帮助程序生成正确的网址,并且无需创建相对重定向,这些重定向既不是浏览器100%支持的,也不会在从网页提供网页时正常工作子路径。
这就是我们用来解决这个问题的方法,它对我们来说是迄今为止的工作:
<强> .ENV 强>
LOAD_BALANCER_IP_MASK=aaa.bbb.ccc.ddd/xx #Subnet mask
LoadBalanced中间件
class LoadBalanced {
public function handle($request, $next) {
if (env("LOAD_BALANCER_IP_MASK")) {
$request->setTrustedProxies([ env("LOAD_BALANCER_IP_MASK") ]);
}
$next($request);
}
}
然后将中间件放在Kernel.php
:
protected $middleware = [
LoadBalanced::class,
//.... It shouldn't matter if it's first or last as long as other global middleware don't need it
];
这是Laravel可用的功能,因为它使用Symfony请求作为基础。这项工作如何是负载均衡器转发一些重要的标题。 Symfony目前了解:
protected static $trustedHeaders = array(
self::HEADER_FORWARDED => 'FORWARDED',
self::HEADER_CLIENT_IP => 'X_FORWARDED_FOR',
self::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST',
self::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
self::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT',
);
,其中包含有关向负载均衡器发出请求的用户以及所使用的协议的信息。
还根据框架评论:
FORWARDED标头是rfc7239的标准。
其他标题是非标准的,但广泛使用 通过流行的反向代理(如Apache mod_proxy或Amazon EC2)。