本文概述
由于客户端的要求, 很多项目都需要在安全的http上下文中运行。在PHP应用程序中, 这可以通过Apache或Nginx的指令来完成, 但是由于缺乏相关知识或者仅仅是因为你很懒, 我们很多人都不会这样做。
从http到https的这种重定向也可以在你的应用程序中完成。由于Symfony 1.4的工作方式, 可以在全球范围内完成此操作, 并且你可以在几秒钟内将项目的任何URL重定向到其安全版本。在本文中, 我们将向你展示如何在项目中全局强制HTTPS。
1.创建一个安全过滤器
在应用程序的lib目录中创建sfSecureFilter.class.php文件, 例如apps / frontend / lib / sfSecureFilter.class.php, 或者在lib目录中的所有应用程序上全局使用它。该文件将包含sfSecureFilter类作为文件名, 该类扩展了Symfony的sfFilter类:
<?php
// apps/frontend/lib/sfSecureFilter.class.php
// or for all apps
// lib/sfSecureFilter.class.php
class sfSecureFilter extends sfFilter
{
/**
* Implements a global redirect from the 'http' to the 'https' version.
*
* @param type $filterChain
* @return type
*/
public function execute($filterChain)
{
$context = $this->getContext();
$request = $context->getRequest();
if (!$request->isSecure())
{
$secure_url = str_replace('http', 'https', $request->getUri());
return $context->getController()->redirect($secure_url);
}
else
{
$filterChain->execute();
}
}
}
execute方法将检索上下文和请求, 并将验证请求是否已得到保护。根据其协议, 如果请求尚未得到保护, 它将自动更改为HTTPS。如果该类未附加到Symfony的筛选器事件, 则该类本身不执行任何操作, 因此, 在创建此文件后继续进行最后一步。
2.注册SSL过滤器
现在, 我们有了一个过滤器类, 可以在不安全的情况下更改协议, 我们需要将其注册到你应用的filters.yml文件中, 特别是在渲染过滤器中, 只需添加带有我们名称的class属性即可。先前创建的类(sfSecureFilter):
# apps/<YourApp>/config/filters.yml
# You can find more information about this file on the symfony website:
# https://symfony.com/legacy/doc/reference/1_4/en/12-Filters
# Run the sfSecureFilter before starting the rendering process
rendering:
class: sfSecureFilter
# Don't enable 'sfSecureFilter' in the security filter as this is only
# executed when a module is secured by some rule on 'security.yml'
security: ~
cache: ~
execution: ~
将更改保存到filters.yml后, 使用php symfony cc清除项目的缓存并访问项目的任何路由。现在, 你将始终自动重定向到它的HTTPS版本。
编码愉快!
评论前必须登录!
注册