У меня есть конечная точка 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 для перенаправления, но не вычитает их.
Я считаю, что ваша проблема связана с trustedProxies
значение на Request
объект. Symfony не слушает заголовки перенаправления HTTP-прокси (особенно X-Forwarded-Proto
) если прокси не указан в доверенных прокси.
Добавив это в свой Symfony index.php
или же app.php
, должен решить вопрос для нгрок.
if ($debug) {
Request::setTrustedProxies(
[$_SERVER['REMOTE_ADDR']],
Request::HEADER_X_FORWARDED_PROTO
);
}
Увидеть http://symfony.com/doc/current/deployment/proxies.html для получения дополнительной информации о вариантах.
Других решений пока нет …