После указания в правильном направлении здесь относительный Laravel 5.4 вместо абсолютного 302 перенаправления
Я пытался заставить промежуточное ПО Laravel TrustProxies работать, но, похоже, игнорирует заголовок X_FORWARDED_PROTO.
Мой сценарий
Мое приложение в Laravel (только что обновленное с 5.4 до 5.5) находится за балансировщиком нагрузки, который переводит весь трафик с HTTPS на HTTP.
Моя проблема
Все перенаправления выполняются по протоколу HTTP, а не по оригинальному протоколу HTTPS.
Попытка решения
Обновите Laravel 5.4 до 5.5 и воспользуйтесь промежуточным ПО TrustProxies, которое теперь поставляется с Laravel из коробки.
Промежуточное ПО имеет:
protected $proxies = '*';
/**
* The current proxy header mappings.
*
* @var array
*/
protected $headers = [
Request::HEADER_FORWARDED => 'FORWARDED',
Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
];
App\Http\Kernel зарегистрировал промежуточное ПО:
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
];
Мои выводы:
TCP-дамп с сервера показывает заголовок:
Запрос:
GET / HTTP/1.1
X_FORWARDED_PROTO: HTTPS
Host: mywebsiteaddress.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Но ответ имеет местоположение по HTTP:
HTTP/1.1 302 Found
Date: Wed, 08 Nov 2017 18:03:48 GMT
Server: Apache/2.4.18 (Ubuntu)
Cache-Control: no-cache, private
Location: http://mywebsiteaddress.com/home
Set-Cookie: laravel_session=eyJp...In0%3D; expires=Wed, 08-Nov-2017 20:03:48 GMT; Max-Age=7200; path=/; HttpOnly
Content-Length: 376
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
Дополнительные комментарии
Поскольку мое приложение было обновлено с версии 5.4 до версии 5.5, я скопировал класс TrustProxies, который в противном случае был бы в новой установке версии 5.5. Затем я зарегистрировал его в ядре.
Возможно, я что-то пропустил.
Я надеюсь:
что моя усталость не затуманивает мой разум, что я не замечаю простой ошибки.
Любые предложения, заранее спасибо!
Обновление:
Включен модуль log_forensics в Apache, и я вижу заголовок x-forwarded-proto в запросе.
GET / HTTP/1.1
X_FORWARDED_PROTO:HTTPS
Host:mywebsiteaddress.com
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv%3a56.0) Gecko/20100101 Firefox/56.0
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language:en-US,en;q=0.5
Accept-Encoding:gzip, deflate, br
Connection:keep-alive
Upgrade-Insecure-Requests:1
Cache-Control:max-age=0
Любая подсказка, почему у Laravel может не быть массива заголовков?