1

我想对某些控制器强制使用 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 中使用处理程序,但我宁愿检查所有请求。延续路线会是去这里的路吗?

4

2 回答 2

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://'
    ]));
}

观察:

  • 您正在重定向到相同的 URL,但对于协议,冗余生成 URL 没有意义
  • 特定控制器是否被重定向的决定由控制器决定;当您达到这一点(并且您可能达到这一点)不仅是每个控制器而且是每个动作时,这一点变得更加重要
于 2012-10-29T12:29:37.180 回答
0

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

ssl 是传输协议细节,与你的站点代码无关,让 apache(或 nginx)处理这些细节。分工负责什么事情最好处理。

如果您提供要捕获的 exac url,我相信有些人可以帮助重写条件逻辑

于 2012-10-29T02:34:46.430 回答