Это может не относиться к Symfony, так как номер порта на стороне клиента не виден в $_SERVER
суперглобальный.
Иногда я использую переадресацию локального порта SSH для предварительного просмотра приложения AWS ElasticBeanstalk, которое находится в частной подсети (недоступно из Интернета).
$ ssh -L 8088:helloworld.eu-west-1.elasticbeanstalk.com:80 bastion
Где bastion
Хост находится в общедоступной подсети и может делать HTTP-запросы к серверам в частной подсети.
Когда я запускаю эту команду, я могу посетить сайт по адресу http://localhost:8088/
Это работает хорошо, если часть сайта не требует номер порта — по крайней мере, в Symfony в любом случае. Когда часть сайта вызывает 403 Запрещенный ответ из-за необходимости аутентификации, Symfony выполнит перенаправление на страницу входа, используя Symfony\Component\Security\Http\HttpUtils::createRedirectResponse()
,
Он пытается перенаправить на URL с помощью $requst->getSchemeAndHttpHost()
в качестве базы. Однако это удаляет номер порта, так как он определил порт как 80
вместо 8088
,
Осматривая $_SERVER
Значение в Xdebug показывает:
HTTP_X_FORWARDED_PORT = 80
HTTP_X_FORWARDED_FOR = 10.0.0.48
HTTP_HOST = localhost
SERVER_PORT = 80
SERVER_ADDR = 10.0.2.70
REMOTE_PORT = 44348
REMOTE_ADDR = 10.0.3.215
Номер порта 8088
в исходном запросе нигде не видно.
Symfony (на самом деле Webserver) не может получить ваш локальный адрес, есть 2 возможных способа решения проблемы:
workproject.local
домен, добавьте заголовки, как X-Forwarded-For
а также X-Real-Ip
на входящие запросы и передать эти запросы через туннель.В любом случае вам также необходимо настроить Symfony для работы с обратным прокси-сервером, для получения дополнительной информации прочтите официальные документы:
Как настроить Symfony для работы за балансировщиком нагрузки или обратным прокси
Других решений пока нет …