在cakephp中扩展html->链接功能的最佳方式是什么,以便我可以 告诉它输出安全(https)链接? 现在,我已经将自己的secure_link函数添加到app_helpers,基本上是一个 链接功能的副本,但在开头添加https。 但似乎应该有一种更好的方法来覆盖html-> link方法,以便我可以指定一个安全选项。
http://groups.google.com/group/cake-php/browse_thread/thread/e801b31cd3db809a 我也在google网上开了一个帖子,有人建议 做像
这样的事情$html->link('my account', array('base' => 'https://', 'controller' => 'users'));
但我无法做到这一点。
添加,这是我拥有上述代码时输出的内容。
<a href="/users/index/base:https:/">my account</a>
我认为850行上的cake / libs / router.php中存在一个错误。有一个关键字'裸',我认为它应该是'基础'虽然将其更改为基础但似乎无法修复它。 从我收集的内容来看,它告诉它要排除那些传入的键,这样它们就不会作为参数包含在内。但我很困惑为什么它是一个'裸'关键字,我能想出的唯一原因是它是一种类型。
答案 0 :(得分:2)
简单地链接到页面的安全版本并不能完全阻止对非安全版本的访问,因此更好的方法可能是为所需的操作实现自动https切换。
<?php
class UsersController extends AppController {
var $components = array('Security');
function beforeFilter() {
$this->Security->blackHoleCallback = '_forceSecure';
$this->Security->requireSecure();
/**
* It is very common to require invocation
* of the parent beforeFilter().
* Your usage may have the invocation
* at the top instead of at the bottom.
*/
parent::beforeFilter();
}
function _forceSecure() {
$this->redirect( 'https://'.env('SERVER_NAME').env('REQUEST_URI') );
}
}
?>
使用此技术,您可以选择需要保护哪些控制器/操作,而无需担心将https://
添加到每个链接。
答案 1 :(得分:1)
如果要覆盖基础,则还必须指定服务器名称,而不仅仅是协议。
如果您要创建的链接应为https://example.com/mysite/users/action
,那么https://example.com/mysite/
就是您的基础。
尝试运行此代码:
$html->link('my account',
array('base' => 'https://example.com/mysite/', 'controller' => 'users'));
答案 2 :(得分:1)
在_forceSecure()中,最好使用此行重定向:
$this->redirect('https://'.env('SERVER_NAME').env('REQUEST_URI'));
否则您将丢失GET请求中指定的任何参数。
答案 3 :(得分:1)
我能做到的最好的是:
$html->link('my account', str_replace('http://', 'https://', $html->url('/users', true)));
完美无缺。