Php Laravel 5.4相对而非绝对302重定向
我对负载平衡器后面的新Laravel应用程序有问题。 我想让Laravel执行身份验证中间件302重定向到相对路径,如/login,而不是/login实际执行的操作 默认情况下我只看到301重定向。htaccess Laravel ships这让我相信Laravel内部的行为是正确的,我错了吗Php Laravel 5.4相对而非绝对302重定向,php,laravel,.htaccess,redirect,http-status-code-302,Php,Laravel,.htaccess,Redirect,Http Status Code 302,我对负载平衡器后面的新Laravel应用程序有问题。 我想让Laravel执行身份验证中间件302重定向到相对路径,如/login,而不是/login实际执行的操作 默认情况下我只看到301重定向。htaccess Laravel ships这让我相信Laravel内部的行为是正确的,我错了吗 有人能给我指出正确的方向吗?如果您需要在负载平衡器后面正确确定请求是否安全,那么您需要让框架知道您在代理后面。这将确保route()和url()帮助程序生成正确的url,并消除创建相对重定向的需要,这两种
有人能给我指出正确的方向吗?如果您需要在负载平衡器后面正确确定请求是否安全,那么您需要让框架知道您在代理后面。这将确保
route()
和url()
帮助程序生成正确的url,并消除创建相对重定向的需要,这两种重定向都不是浏览器100%支持的,并且在从子路径服务网页时也无法正常工作
这就是我们用来解决这个问题的方法,到目前为止它对我们有效:
.env
LOAD_BALANCER_IP_MASK=aaa.bbb.ccc.ddd/xx #Subnet mask
负载平衡中间件
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',
);
其中包含有关向负载平衡器发出请求的用户和所用协议的信息
此外,根据框架意见:
转发的标头是截至的标准标头
其他标题是非标准的,但被广泛使用
通过流行的反向代理(如ApacheModu代理或AmazonEC2)
你想用这个解决什么?我有一个负载平衡器后面的应用程序。负载平衡器接收https并将http发送到我的应用程序。问题是,我的应用程序正在重定向用户以绝对url登录,这意味着将HTTPS替换为HTTP。如果我在负载平衡器中从HTTP重定向到HTTPS,那么我会遇到太多重定向问题。正确的处理方法是这样做,例如,
$request->setTrustedProxies([/*负载平衡器的IP*/])
。正确配置的负载平衡器发送一个X-Forwarded-Proto
,只要报头来自可信源,laravel就可以使用该协议来确定正确的协议。查看更多详细信息谢谢@apokryfos。完全有道理,我会马上测试这个建议。尽管我仍然对绝对/相对路径感到好奇,我认为这更像是框架的偏好。我有一个与Zend Framework类似的应用程序,它使用相对路径进行重定向。我会再次报告结果,谢谢。如果您是从子文件夹(例如从example.com/subfolder/
为框架提供服务,则相对重定向可能会有问题。一些网站、库和框架使用X_-FORWARDED_-PROTO(带下划线)很奇怪而这正是为什么Laravel 5.5不起作用的原因。Laravel(或Symphony)仅识别X-PROTO(带连字符)。看看这里我是如何解决我的问题的:这很奇怪,因为laravel使用的是带下划线的标题。也许在中间件堆栈的某个点上正在进行头的转换。5.5中间件似乎在