【发布时间】:2012-03-22 21:25:27
【问题描述】:
我使用的是 CakePHP 2.1.0,我注意到如果你想访问控制器的动作,那么你为动作名称使用什么大小写并不重要;您将始终在控制器中执行该操作。但是,该操作将期望视图文件以您用于访问该操作的相同大小写命名。因此,如果我要去http://example.com/users/aDd,我会按预期点击“用户”控制器的“添加”操作中的代码,但它会查找不存在的 aDd.ctp。有没有办法让动作名称只有在小写或被视为错误 URL 时才能访问?
更新:我认为在 CakePHP 级别而不是在 Web 服务器级别执行此操作是最安全的。这样,如果出于某种原因,您希望 http://example.com/FoO 有效而不管大小写如何,但您希望 http://example.com/bar 和 http://example.com/users/add 仅在小写时才可访问,您可以这样做。
有没有人发现将这个添加到“App”控制器的“beforeFilter”方法中存在缺陷?:
if ($this->request->params['controller'] != strtolower($this->request->params['controller']) || $this->action != strtolower($this->action)) {
$redirect = Router::url(array(
'controller' => strtolower($this->request->params['controller']),
'action' => strtolower($this->action)
) + $this->request->params['pass']);
foreach ($this->request->params['named'] as $key => $value) {
$redirect .= "/$key:$value";
}
$this->redirect($redirect);
}
【问题讨论】:
-
在这种情况下,我认为只添加几行代码让Controller加载小写版本(add.ctp)会更友好;额外的好处是在浏览器中重写 URL 只是为了让它更漂亮。
-
只是一个猜测,您可能可以通过路由器定义中的一些匹配以某种方式捕获它们,请参阅book.cakephp.org/2.0/en/development/routing.html。或者如果这不起作用,总是有 mod_rewrite 或类似的,这取决于你的网络服务器。
-
如果您总是在小写视图中构建链接,那么谁会访问您的网站以不同大小写的 url?我不确定在每个请求上运行这段代码是否值得,也许一两次有用?
-
@nIcO 我完全明白你在说什么,但请记住,虽然 大多数 人复制和粘贴 URL,但有些人处理它们的方式不同。例如,一个人可能会通过电话将它读给其他人,而那个人可能会打开大写锁定。然后那个人可能会喜欢他们看到的内容,然后将该链接发布到 Facebook 上,供其他人点击。据我了解,谷歌认为具有不同大小写的 URL 是唯一的,因此这可能会破坏您的排名。是的,不太可能,但仍然需要考虑。
标签: cakephp