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

Дата обновления перевода 2023-06-30

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

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

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()
    {
        // ...
    }
}

Конфигурация выше заставляет маршрут 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, определённые в стороннем пакете (см. Как форсировать HTTPS или HTTP для разных URL, чтобы узнать больше).