Intereting Posts
Найти общие значения в нескольких массивах с помощью PHP Передача переменной в ее родительскую функцию в PHP? Как определить, является ли страница RSS или ATOM-фидом Как защитить загружаемые файлы в удаленном каталоге от не-премиум-пользователей (в php?) Сценарий вычисления Javascript для вычисления входного значения формы затем сохраните как скрытый ввод для page2.php ZipArchive не открывается файл – Код ошибки: 19 Группа Google и код подписки Эффективная перезагрузка данных / передача данных с сервера на клиент Лучший способ создать пустой объект в JSON с PHP? Sugarcrm, написание пользовательского кода при сохранении записи Не удалось опубликовать сообщение с axios в приложении Laravel Что такое почтовый токен в сгенерированном коде Postman? Разделить записи на две колонки PHP-элемент функции синтаксиса из кода Javascript Вызов скрипта php через регулярные интервалы с помощью javascript

Как разрешить Symfony 2 использовать схему протокола (http vs https)

У меня есть веб-сайт Symfony 2, который либо работает по HTTP в разработке, либо на HTTPS в производстве.

Я заметил, что в производстве URL-адреса, созданные Symfony, все еще отображаются как HTTP.

Как я могу;

  1. Пусть рамочная программа принимает текущий протокол, из которого обслуживается веб-сайт (вероятно, предпочтительнее)?
  2. Или заставить весь сайт в режиме HTTPS работать только на производстве?

Оба решения, заданные @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, он вызывает бесконечный цикл перенаправления, т.е.

  1. Вы удаляете URL-адрес через HTTPS.
  2. Балансировщик нагрузки передает запрос веб-серверу как HTTP.
  3. В Symfony маршрут настроен на использование HTTPS, который вызывает перенаправление на уровне PHP.
  4. Назад к 1 (бесконечный цикл).

Чтобы решить мою проблему, я должен был сообщить своему веб-серверу о том, что мой сайт работает в HTTPS. Следуя инструкциям, приведенным в разделе « Как настроить Symfony для работы за балансировщиком нагрузки или страницы обратного прокси- сервера», я могу исправить эту проблему, то есть мой веб-сервер теперь снабжается правильной информацией заголовка и теперь генерирует правильный URL-адрес ,

Самый простой способ передать требуемые заголовки из балансировщика нагрузки на веб-сервер – добавить следующую строку в ваш web/app.php :

 Request::setTrustedProxies(array($request->server->get('REMOTE_ADDR'))); 

Остерегайтесь, что вышеупомянутое может быть не лучшим решением для вашей конкретной конфигурации. Пожалуйста, обратитесь к документации для других подходов, которые могут быть более подходящими для вашей настройки.

Чтобы заставить HTTPS в вашей рабочей среде, вы можете использовать следующую конфигурацию:

  1. В вашем app/config/routing.yml :

     acme_hello: resource: "@AcmeHelloBundle/Resources/config/routing.yml" schemes: [https] 
  2. В вашем app/config/routing_dev.yml :

     _main: resource: routing.yml schemes: [http] 

    если вы хотите принудительно настроить HTTP для всех своих маршрутов в среде разработки.

  3. И в вашем @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% } 

(адаптированный из старого ответа )