如何强制路由总是使用HTTPS或HTTP

3.4 版本
维护中的版本

有时,你想为一些路由提供安全保障,确保它们总是以HTTPS协议被访问到。路由组件允许你通过设置schemes来强制指定URI的scheme。

1
2
3
4
secure:
    path:     /secure
    defaults: { _controller: AppBundle:Main:secure }
    schemes:  [https]
1
2
3
4
5
6
7
8
9
10
<?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>
1
2
3
4
5
6
7
8
9
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来访问。

当生成secure路由的URL时,如果当前的模式是HTTP,Symfony将自动地生成一个HTTPS的绝对URL作为当前的scheme:

1
2
3
4
5
6
7
8
9
10
11
{# If the current scheme is HTTPS #}
{# 如果当前模式是HTTPS #}
{{ path('secure') }}
{# generates /secure #}
{# 生成 /secure #}
 
{# If the current scheme is HTTP #}
{# 如果当前模式是 HTTP #}
{{ path('secure') }}
{# generates https://example.com/secure #}
{# 生成 https://example.com/secure #}

传入的请求也会强制使用这些条件。如果你试图用HTTP访问 /secure 的路径,会被自动重定向到相同的URL上,但这个URL使用的是HTTPS模式。

上面的例子使用https的scheme,但你也可以强制它总是使用http的URL。

安全组件提供了另一种方式去执行HTTP和HTTPS,那就是通过设置requires_channel 。这种替代方法更适合于确保你网站的某个“area(区域)”(如,/admin区域下的所有URL),也适用于当你想为第三方Bundle中的URL提供安全保障时(参考如何在不同的URL中强制使用HTTPS或HTTP以了解更多)。

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

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