У меня есть веб-сайт Symfony 2, который либо работает по HTTP в разработке, либо на HTTPS в производстве.
Я заметил, что в производстве URL-адреса, созданные Symfony, все еще отображаются как HTTP.
Как я могу;
Оба решения, заданные @AL и @AndreySobkanyuk, действительны, но не применяются к проблеме, которую я испытывал.
Проблема с обоими решениями @AL и @AndreySobkanyuk заключается в том, что Symfony 2 пытается сделать перенаправление. Т.е. если URL-адрес доступен через протокол (например, HTTP), который в конфигурации маршрутизации задается по-разному (например, HTTPS), Symfony 2 будет выполнять перенаправление (на уровне PHP).
В моей ситуации переписывание URL-адресов происходит на уровне веб-сервера (Apache), потому что мой сайт обслуживает все URL-адреса как HTTPS.
Проблема, с которой я столкнулась, заключалась в том, что URL-адреса, созданные в моих шаблонах, были визуализированы с использованием протокола HTTP, они должны были быть HTTPS. Я предполагал, что есть способ сказать Symfony, что всякий раз, когда он отображает URL-адрес, он должен префикс HTTPS вместо HTTP. К сожалению, нет (или, по крайней мере, не того, что я знаю).
Поскольку мой сайт работает за балансировщиком нагрузки, мой веб-сервер не знал, что он должен отображать URL как HTTPS, потому что внутреннее соединение между балансировщиком нагрузки и веб-сервером является HTTP. Это означает, что с точки зрения Symfony все запросы выполняются с использованием HTTP и путем форсирования протокола на уровне маршрутизации Symfony, он вызывает бесконечный цикл перенаправления, т.е.
Чтобы решить мою проблему, я должен был сообщить своему веб-серверу о том, что мой сайт работает в HTTPS. Следуя инструкциям, приведенным в разделе « Как настроить Symfony для работы за балансировщиком нагрузки или страницы обратного прокси- сервера», я могу исправить эту проблему, то есть мой веб-сервер теперь снабжается правильной информацией заголовка и теперь генерирует правильный URL-адрес ,
Самый простой способ передать требуемые заголовки из балансировщика нагрузки на веб-сервер – добавить следующую строку в ваш web/app.php
:
Request::setTrustedProxies(array($request->server->get('REMOTE_ADDR')));
Остерегайтесь, что вышеупомянутое может быть не лучшим решением для вашей конкретной конфигурации. Пожалуйста, обратитесь к документации для других подходов, которые могут быть более подходящими для вашей настройки.
Чтобы заставить HTTPS
в вашей рабочей среде, вы можете использовать следующую конфигурацию:
В вашем app/config/routing.yml
:
acme_hello: resource: "@AcmeHelloBundle/Resources/config/routing.yml" schemes: [https]
В вашем app/config/routing_dev.yml
:
_main: resource: routing.yml schemes: [http]
если вы хотите принудительно настроить HTTP
для всех своих маршрутов в среде разработки.
И в вашем @AcmeHelloBundle/Resources/config/routing.yml
вы можете разместить все свои маршруты.
Для получения дополнительной информации о schemes: [https]
и других способах ее работы вы можете посмотреть документацию Symfony .
Я нашел это полезным для моего случая (используя nginx )
add to nginx fcgi params следующую строку. Это необходимо, потому что Symfony2 полагается на эту переменную, переданную веб-сервером на PHP, для создания правильного URL-адреса. Apache делает это по умолчанию, но nginx нуждается в этой специальной конфигурации .
fastcgi_param HTTPS on;
http://blog.servergrove.com/2011/04/04/symfony2-quick-tip-generateurl-with-https-on-nginx/
Я использовал это решение для принудительного HTTP или HTTPS:
Я определил значение %auth_required_channel%
в файлах конфигураций различных сред:
app / config / config_dev.yml и app / config / config_test.yml
parameters: auth_required_channel: 'http'
приложение / Config / config_prod.yml
parameters: auth_required_channel: 'https'
приложение / Config / security.yml
Этот параметр затем используется для запроса HTTP или HTTPS-канала ( документация Symfony2 ):
security: [...] access_control: [...] - { path: ^/admin, roles: ROLE_ADMIN, requires_channel: %auth_required_channel% }
(адаптированный из старого ответа )