【问题标题】:CakePHP: force lowercase action names?CakePHP:强制小写动作名称?
【发布时间】: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/barhttp://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


【解决方案1】:

嗯。您的AppController 中的这些行怎么样:

public function beforeFilter() {
  $this->view = strtolower($this->view);
}

【讨论】:

  • 这是个好主意,但看起来 URL 仍然有效。据我了解,这对 SEO 不利(请参阅 here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2015-01-24
相关资源
最近更新 更多