Не удается заставить промежуточное ПО TrustProxies работать

После указания в правильном направлении здесь относительный 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 может не быть массива заголовков?


person Mario    schedule 08.11.2017    source источник
comment
Кстати, я сделал dd($_SERVER); в route/web.php прямо перед перенаправлением и не смог найти X_FORWARED_PROTO в заголовках.   -  person Mario    schedule 08.11.2017
comment
Работало ли это, пока вы были на 5.4?   -  person Suraj    schedule 08.11.2017
comment
@Suraj Я не тестировал 5.4, так как он представлял собой более ручную настройку, что означало больший риск ошибок. Я решил лучше обновиться до 5.5, считая это более высокой вероятностью успеха. Я собираюсь протестировать новое макетное приложение версии 5.5, но для воспроизведения сценария требуется сотрудничество с моей сетевой командой.   -  person Mario    schedule 08.11.2017
comment
Вы используете балансировщик нагрузки AWS?   -  person Suraj    schedule 08.11.2017
comment
Нет @Suraj, это наш собственный аппаратный балансировщик нагрузки. Прямо сейчас он просто используется для предоставления доступа к нашим приложениям в Интернете с помощью подстановочного ssl-сертификата. Все приложения за этим балансировщиком нагрузки прослушивают HTTP. Но у меня проблема только с приложениями Laravel.   -  person Mario    schedule 08.11.2017
comment
Я думаю, что это может быть проблема в Apache vhost, так как я не вижу, чтобы этот заголовок достигал Laravel.   -  person Mario    schedule 08.11.2017


Ответы (1)


Это действительно была усталость.
Балансировщик нагрузки работал с заголовком X_FORWARDED_PROTO для приложений C# (IIS), поэтому на этот раз сетевая команда установила заголовок таким же образом.
Но для Laravel заголовок должен быть в форма X-FORWARDED-PROTO, которая, как я понимаю, является правильным именем (тире вместо подчеркивания).
Вот почему Laravel (на самом деле Symfony) отбрасывал заголовок из запроса.

person Mario    schedule 09.11.2017