如何在不同的URL中强制使用HTTPS或HTTP

3.4 版本
维护中的版本

你可以强制自己的网站在security配置信息中使用HTTPS协议。他是通过在 access_control 规则中使用 requires_channel 选项来完成的。例如,如果你要强制所有以 /secure 开头的URLs使用HTTPS,那么你应该使用以下配置:

1
2
3
4
5
6
# app/config/security.yml
security:
    # ...

    access_control:
        - { path: ^/secure, roles: ROLE_ADMIN, requires_channel: https }
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>
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_ANONYM role(属性):

1
2
3
4
5
6
# app/config/security.yml
security:
    # ...

    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
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>
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,参考 如何强制路由总是使用HTTPS或HTTP 以了解更多。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)