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

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

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    // src/Controller/MainController.php
    namespace App\Controller;
    
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    
    class MainController extends Controller
    {
        /**
         * @Route("/secure", name="secure", schemes={"https"})
         */
        public function secure()
        {
            // ...
        }
    }
    
  • YAML
    1
    2
    3
    4
    5
    # config/routes.yaml
    secure:
        path:       /secure
        controller: App\Controller\MainController::secure
        schemes:    [https]
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    <!-- config/routes.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">App\Controller\MainController::secure</default>
        </route>
    </routes>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    8
    // config/routes.php
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    $collection->add('secure', new Route('/secure', array(
        '_controller' => 'App\Controller\MainController::secure',
    ), array(), array(), '', array('https')));
    

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

При генерировании URL secure, и если текущая схема - HTTP, Symfony автоматически сгенерирует абсолютный URL c HTTPS как по схеме, даже при использовании функции path():

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

{# Если текущая схема HTTP #}
{{ path('secure') }}
{# генерирует абсолютный URL: 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.