netglue / zf2-ssl-module
帮助强制使用SSL连接进行HTTP请求的ZF2模块
Requires
- php: >=5.3.3
- zendframework/zendframework: 2.*
This package is auto-updated.
Last update: 2021-09-02 12:01:58 UTC
README
此模块的目的是执行重定向,无论是从控制器中手动执行,还是通过在配置中指定必须使用SSL或非SSL的控制器/路由/URL。
安装
应使用composer进行安装,将以下内容添加到您的 composer.json
文件中:
require {
'netglue/zf2-ssl-module': "dev-master"
}
根据模块是否被标记为任何版本或稳定性信息,您可能还需要将 "minimum-stability":"dev"
设置添加到composer中。
运行 $ php composer.phar update
后,将 'NetglueSSL'
添加到您的 ZF2 应用程序的 config/application.config.php
文件中的模块名称,将 vendor/netglue/zf2-ssl-module/config/module.config.php.dist
中的dist配置复制到您的自动加载配置目录,并根据需要重命名/修改。
贡献、反馈 & 问题
此模块主要是为了我自己使用,作为解决我面临的一个常见问题的快速解决方案。如果它对您有帮助,我很乐意了解,如果您有贡献的改进,请继续前进并进行分支。我没有时间回答支持请求,但如果您发现任何错误,请随时将其添加到 问题跟踪器
待办事项
- 测试
控制器插件
此模块有2个控制器插件: forceSSL
和 forceHttp
。如果模块配置正确,您可以在任何控制器操作中调用 $this->forceSSL()
将连接重定向到SSL主机(如果当前通过标准http连接),反之亦然 $this->forceHttp()
要防止重定向发生之前执行操作的其他部分,您应该用类似以下内容包装对控制器插件的调用
if($this->forceSSL()) {
return;
}
forceSSL
和 forceHttp
的 __invoke()
方法将返回一个 Zend\Http\Response
对象,如果需要重定向,或者如果当前请求已经使用所需协议,则返回 NULL
。
配置
主要选项告诉模块您正在使用的SSL和非SSL主机。如果应用程序运行在同时使用这两个主机的服务器上,HTTP和HTTPS都位于标准端口,并且没有为每个主机不同的uri前缀,则可以不设置所有选项或为null。
假设这两个uri是等效的
http://www.example.com/app-root/some-action
https://www.ssl-host.com/secure/app-root/some-action
您的基本选项配置将是
'ssl_hostname' => 'www.ssl-host.com',
'http_hostname' => 'www.example.com',
'ssl_path_prefix' => '/secure',
'http_path_prefix' => NULL,
使用路由参数强制SSL/非SSL
要将任何配置的路由强制使用SSL,请将 'force-ssl' => 'ssl'
添加到路由默认值,或将 'force-ssl' => 'http'
添加到强制HTTP。
使用此方法允许您设置路由的默认值,并在子路由中覆盖它。您还可以将force-ssl设置为false,以停止子路由中进一步的评估。
此方法是评估的第一步,绕过了使用控制器、路由名称和uri配置测试uri的测试。
使用控制器、路由名称和部分uri强制SSL/非SSL
其他选项 ssl_only
和 http_only
预期将采用以下数组的格式
'ssl_only' => array(
'controllers' => array(
'Some\Controller\Class', // As it would be when retreived from the RouteMatch object, i.e. 'Application\Controller\Index'
),
'routes' => array(
'home',
'some/other/routename',
),
'uris' => array(
'/account',
'/login',
),
);
对于这些的匹配是非常基本的,您必须小心,不要创建无限重定向循环。
如果in_array($controllerName, $searchArray)
评估为true,则将匹配'controllers'
数组中的任何控制器名称。所以,如果您要将相同的控制器添加到ssl_only
和http_only
,您将直接陷入无限重定向循环。
路由名称也是如此。
uri数组略有不同。此数组的每个元素都将转换为基本正则表达式,因此/ssl-only-please
的值将转换为模式/^\/ssl-only-please/
仅测试uri的路径部分,因此忽略查询字符串、主机名、片段等。您应该期望示例匹配如下URL:/ssl-only-please/foo
、/ssl-only-please?blah=blah
决定是否进行重定向的顺序如下:控制器、路由、uri。一旦匹配成功,则返回响应并发生重定向,因此您不能强迫整个控制器使用SSL,并强制其中一个操作使用标准HTTP。这并不那么聪明。如果您真的需要,最好使用路由参数。
注意事项
如前所述,控制器、路由名称和uri模式匹配离智能相差甚远,我相信可以大大改进。此外,如果您使用任何配置选项,包括设置路由参数,最好避免使用控制器插件,因为这些可能导致无限重定向循环。例如,如果您定义了一个具有强制SSL的路由参数'my-route'
,然后在相应的控制器中发出$this->forceHttp()
,很明显,您将陷入循环!