Относительный Laravel 5.4 вместо абсолютных 302 редиректов

У меня проблемы с новым приложением Laravel за балансировщиком нагрузки. Я хотел бы, чтобы Laravel выполнял перенаправление промежуточного программного обеспечения 302 Auth на относительный путь, например, /login, а не http://myappdomain.com//login.

Я вижу только 301 переадресацию по умолчанию.htaccess Корабли Laravel, что заставляет меня верить, что в Laravel правильное поведение, я не прав?

Может ли кто-нибудь указать мне правильное направление?

1 ответ

Решение

Если вам нужно правильно определить, был ли запрос защищен за балансировщиком нагрузки, вы должны сообщить платформе, что вы находитесь за прокси-сервером. Это гарантирует, что route() а также url() помощники генерируют правильные URL-адреса и устраняют необходимость создавать относительные перенаправления, которые не на 100% поддерживаются браузерами, а также не будут работать должным образом при обслуживании веб-страницы из подпути.

Это то, что мы используем для решения этой проблемы, и пока оно работает для нас:

.env

LOAD_BALANCER_IP_MASK=aaa.bbb.ccc.ddd/xx #Subnet mask

LoadBalanced Middleware

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).

Другие вопросы по тегам