Не удается заставить промежуточное ПО 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 из коробки.
Middleware имеет:
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 может не иметь в массиве заголовков?
1 ответ
Это была действительно усталость.
Балансировщик нагрузки работал с заголовком X_FORWARDED_PROTO для приложений C# (IIS), поэтому сетевая команда на этот раз установила заголовок таким же образом.
Но для Laravel заголовок должен быть в форме X-FORWARDED-PROTO, как я понимаю, это правильное имя (тире вместо подчеркивания).
Вот почему Laravel (в действительности Symfony) отбрасывал заголовок из запроса.