Как форсировать HTTPS или HTTP для разных URL

Вы можете заставить части вашего сайта использовать HTTPS-протокол в конфигурации безопасности. Это делается через правила access_control, используя опцию requires_channel. Например, если вы хотите заставить все URL, начинающиеся с /secure, использовать HTTPS, то вы можете использовать следующую конфигурацию:

  • YAML
    1
    2
    3
    4
    5
    6
    # app/config/security.yml
    security:
        # ...
    
        access_control:
            - { path: ^/secure, roles: ROLE_ADMIN, requires_channel: https }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <!-- app/config/security.xml -->
    <?xml version="1.0" encoding="UTF-8"?>
    <srv:container xmlns="http://symfony.com/schema/dic/security"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:srv="http://symfony.com/schema/dic/services"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <config>
            <!-- ... -->
    
            <rule path="^/secure" role="ROLE_ADMIN" requires_channel="https" />
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    // app/config/security.php
    $container->loadFromExtension('security', array(
        // ...
    
        'access_control' => array(
            array(
                'path'             => '^/secure',
                'role'             => 'ROLE_ADMIN',
                'requires_channel' => 'https',
            ),
        ),
    ));
    

Сама форма входа в систему должна позволять анонимный доступ, иначе пользователи не смогут аутентифицироваться. Чтобы заставить её использовать HTTPS, вы всё ещё можете использовать правила access_control, используя роль IS_AUTHENTICATED_ANONYMOUSLY:

  • YAML
    1
    2
    3
    4
    5
    6
    # app/config/security.yml
    security:
        # ...
    
        access_control:
            - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    <!-- app/config/security.xml -->
    <?xml version="1.0" encoding="UTF-8"?>
    <srv:container xmlns="http://symfony.com/schema/dic/security"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:srv="http://symfony.com/schema/dic/services"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <config>
            <!-- ... -->
    
            <rule path="^/login"
                role="IS_AUTHENTICATED_ANONYMOUSLY"
                requires_channel="https"
            />
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    // app/config/security.php
    $container->loadFromExtension('security', array(
        // ...
    
        'access_control' => array(
            array(
                'path'             => '^/login',
                'role'             => 'IS_AUTHENTICATED_ANONYMOUSLY',
                'requires_channel' => 'https',
            ),
        ),
    ));
    

Также возможно указать использование HTTPS в конфигурации маршрутизации, смотрите How to Force Routes to Always Use HTTPS or HTTP, чтобы узнать больше деталей.

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