Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5.4相对而非绝对302重定向_Php_Laravel_.htaccess_Redirect_Http Status Code 302 - Fatal编程技术网

Php Laravel 5.4相对而非绝对302重定向

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,并消除创建相对重定向的需要,这两种

我对负载平衡器后面的新Laravel应用程序有问题。 我想让Laravel执行身份验证中间件302重定向到相对路径,如/login,而不是/login实际执行的操作

默认情况下我只看到301重定向。htaccess Laravel ships这让我相信Laravel内部的行为是正确的,我错了吗


有人能给我指出正确的方向吗?

如果您需要在负载平衡器后面正确确定请求是否安全,那么您需要让框架知道您在代理后面。这将确保
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中间件似乎在