如何强制路由总是使用HTTPS或HTTP
有时,你想为一些路由提供安全保障,确保它们总是以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以了解更多)。