为某些控制器强制使用SSL的最佳方法?

时间:2012-10-29 02:32:00

标签: php lithium

我想为某些控制器强制使用SSL,并为其他所有控件删除SSL。前段时间我在自定义Controller类的_init()中有一个片段,它没有像我希望的那样工作:

$ssl = $this->request->is('ssl');

$forceSecured = in_array($this->request->controller, array('Orders', 'Customers'));

//remove SSL for non-ssl pages
if ($ssl && !$forceSecured) {
    return $this->redirect(Router::match(
                    $this->request->params,
                    $this->request,
                    array('absolute' => true, 'scheme' => 'http://')
            )
    );
}

// Force ssl on for ssl pages
if (!$ssl && $forceSecured) {
    return $this->redirect(Router::match(
                    $this->request->params,
                    $this->request,
                    array('absolute' => true, 'scheme' => 'https://')
            )
    );
}

我支持遗留应用程序,因此我定义了多个硬编码路由。我确信我可以在Router :: connect中使用处理程序,但我宁愿对所有请求进行检查。继续路线是否可以到达这里?

2 个答案:

答案 0 :(得分:3)

两件事:(1)你不能从Response返回_init()对象(这是redirect()返回的对象),以及(2)你有一个微妙的设计问题。我建议这样做:

protected $_secure = false;

public function __invoke($request, $params, array $options = array()) {
    if (!$this->_secure && !$request->is('ssl')) {
        return parent::__invoke($request, $params, $options);
    }
    return $this->redirect(Router::match($request->url, $request, [
        'absolute' => true, 'scheme' => 'https://'
    ]));
}

<强>观察:

  • 您正在重定向到相同的网址,但对于协议,冗余生成网址没有意义
  • 特定控制器是否被重定向的决定与控制器有关;这一点变得更加重要,因为你达到了目的(你可能达到目的),这不仅仅是每个控制器而是每个动作

答案 1 :(得分:0)

为什么要让它进入应用程序?如果要阻止特定路由强制ssl,请使用htaccess重写。

Ssl是一个传输协议细节,与您的站点代码无关,让apache(或nginx)处理这些细节。将责任分离到最适合处理的事情。

如果您提供exac网址,我想确定somone可以帮助重写条件逻辑