netglue/zf2-ssl-module

此包已被废弃,不再维护。未建议替代包。

帮助强制使用SSL连接进行HTTP请求的ZF2模块

0.1.2 2013-06-04 17:23 UTC

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个控制器插件: forceSSLforceHttp。如果模块配置正确,您可以在任何控制器操作中调用 $this->forceSSL() 将连接重定向到SSL主机(如果当前通过标准http连接),反之亦然 $this->forceHttp()

要防止重定向发生之前执行操作的其他部分,您应该用类似以下内容包装对控制器插件的调用

if($this->forceSSL()) {
	return;
}

forceSSLforceHttp__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_onlyhttp_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_onlyhttp_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(),很明显,您将陷入循环!