Перенаправление с косой чертой в конце Symfony отключает HTTPS

У меня есть конечная точка Symfony, которая выглядит так:

/**
 * @Route("/test/")
 */
public function testAction(){
    return new JsonResponse(['hello' => 'world']);
}

Когда я обслуживаю его на своем сервере с поддержкой HTTPS (или ngrok), работает следующее:

curl https://subdomain.ngrok.io/controller/test/

Он выводит:

{"Привет мир"}

Однако, когда я пытаюсь сделать следующее (обратите внимание на отсутствующую косую черту):

curl https://subdomain.ngrok.io/controller/test

Я получаю веб-сайт перенаправления и следующий заголовок ответа:

Местоположение: http://subdomain.ngrok.io/controller/test/

Он добавляет косую черту в конце, но, похоже, меняет протокол на HTTP. Это можно легко решить, заменив @Route("/test/") на @Route("/test"), и в этом случае совпадение будет работать как для отсутствующих, так и для присутствующих косых черт. Однако я бы предпочел убедиться, что всякий раз, когда Symfony решает, что перенаправление необходимо, он поддерживает протокол.

Есть туториалы о том, как везде применять HTTPS, но меня это не интересует. Мне нужно, чтобы Symfony никогда не меняла протокол при создании перенаправлений. Как я могу это сделать?

РЕДАКТИРОВАТЬ: Что еще хуже, так это то, что это 301 редиректы. Это означает, что если к нему когда-либо будет доступ из браузера, ущерб будет довольно постоянным.

РЕДАКТИРОВАТЬ 2: при удалении завершающей косой черты из параметра @Route он прекращает перенаправление на URL-адреса, содержащие завершающую косую черту, поэтому .../test будет работать. Однако, несмотря на то, что .../test/ не будет перенаправлять на .../test, теперь будет выдаваться ошибка 404. Таким образом, Symfony автоматически добавляет косые черты к URL-адресам для перенаправления, но не вычитает их.


person arik    schedule 20.04.2016    source источник
comment
Насколько мне известно, Symfony не удаляет/добавляет косые черты автоматически, что вы используете для добавления/удаления косых черт? веб-сервер, прослушиватель ядра?   -  person Otto    schedule 20.04.2016
comment
Не то чтобы я в курсе. Он делает это в значительной степени по собственной воле. Я не помню добавления и не вижу никаких дополнительных настроек ни в одном из файлов конфигурации.   -  person arik    schedule 20.04.2016
comment
какое-то правило перезаписи веб-сервера?   -  person Matteo    schedule 20.04.2016
comment
Нет, это происходит как с Ngrok, так и с моим собственным веб-сервером. Я примерно на 98% уверен, что в Ngrok нет особых правил перезаписи, тем более, что при удалении косой черты в конце аннотации он работает без перенаправления.   -  person arik    schedule 20.04.2016
comment
Пожалуйста, смотрите мое второе редактирование.   -  person arik    schedule 20.04.2016


Ответы (1)


Я полагаю, что ваша проблема связана со значением trustedProxies объекта Request. Symfony не прослушивает заголовки переадресации HTTP-прокси (в частности, X-Forwarded-Proto), если прокси не указан в доверенных прокси.

Добавление этого к вашему Symfony index.php или app.php должно решить проблему для ngrok.

if ($debug) {
    Request::setTrustedProxies(
        [$_SERVER['REMOTE_ADDR']],
        Request::HEADER_X_FORWARDED_PROTO
    );
}

См. http://symfony.com/doc/current/deployment/proxies.html для получения дополнительной информации о параметрах.

person Ryan    schedule 01.05.2018