Как заставить маршруты всегда использовать HTTPS или HTTP

Иногда вам хочется обезопасить некоторые маршруты и быть уверенными, что они всегда доступны через HTTPS-протокол. Компонент маршрутизации позволяет вам усилить схему URI с помощью схем:

  • YAML
    1
    2
    3
    4
    5
    # app/config/routing.yml
    secure:
        path:     /secure
        defaults: { _controller: AppBundle:Main:secure }
        schemes:  [https]
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    <!-- app/config/routing.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    
    <routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <route id="secure" path="/secure" schemes="https">
            <default key="_controller">AppBundle:Main:secure</default>
        </route>
    </routes>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    // app/config/routing.php
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    $collection->add('secure', new Route('/secure', array(
        '_controller' => 'AppBundle:Main:secure',
    ), array(), array(), '', array('https')));
    
    return $collection;
    

Конфигурация выше заставляет маршрут secure всегда использовать HTTPS.

При генерировании URL secure, и если текущая схема - HTTP, Symfony автоматически сгенерирует абсолютный URL c HTTPS как по схеме:

1
2
3
4
5
6
7
{# Если текущая схема - HTTPS #}
{{ path('secure') }}
{# генерирует /secure #}

{# Если текущая схема - HTTP #}
{{ path('secure') }}
{# генерирует https://example.com/secure #}

Это требование также обязательно для входящих запросов. Если вы попоробуете получить доступ к пути /secure с HTTP, вы автоматически будете перенаправлены на тот же URL, но со схемой HTTPS.

Пример выше использует для схемы https, но вы также можете заставить URL всегда использовать http.

Note

Компонент безопасности предоставляет вам другой способ принуждать к HTTP или HTTPS с помощью настройки requires_channel. Этот альтернативный метод лучше приспособле для того, чтобы обезопасить "часть" вашего сайте (все URL под /admin) или когда вы хотите обезопасить URL, определённые в стороннем пакете (см. How to Force HTTPS or HTTP for different URLs, чтобы узнать больше).

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.