2012-03-22 22 views
2

我正在使用CakePHP 2.1.0,我注意到如果你想访问一个控制器的动作,那么它与动作名称使用什么套管无关;您将始终在控制器中执行该操作。但是,该操作会期望视图文件的名称与您用于访问该操作的外观相同。因此,如果我要去http://example.com/users/aDd,我会像预期的那样点击“用户”控制器的“添加”操作中的代码,但它会查找不存在的dd.ctp。有没有一种方法可以使动作名称只能在小写的情况下才能被访问,否则他们会被认为是错误的URL?CakePHP:强制小写动作名称?

更新:我认为在CakePHP级别而不是Web服务器级别上执行此操作是最安全的。这样,如果无论出于何种原因,您希望http://example.com/FoO无论如何都是有效的,但是您希望http://example.com/barhttp://example.com/users/add只能在小写时可访问,您可以这样做。

有谁看到在添加此的“应用程序”控制器“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); 
} 
+0

在这种情况下,我认为这将是友好的,只是添加几行代码是让控制器加载小写版本(add.ctp);一个好处就是在浏览器中重写URL,以使它更漂亮。 – starlocke 2012-03-22 21:42:33

+0

只是一个猜测,你可能可以用某种方式在路由器定义中找到它们,参见http://book.cakephp.org/2.0/en/development/routing.html。或者,如果这不起作用,总是有mod_rewrite或类似的,这取决于你的网络服务器。 – 2012-03-22 21:42:34

+0

如果您始终以小写形式在视图中构建链接,那么谁会以不同的方式访问您的网站?我不确定它是否值得在每个请求上运行此代码以实现有用功能,可能是一次或两次? – nIcO 2012-03-23 22:19:31

回答

1

嘛。如何在这些线路的AppController

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

这是一个好主意,但它仍然看起来像网址是有效的。据我所知,这会对SEO不利(详见[这里](http://www.seroundtable.com/archives/019577.html)) – Nick 2012-03-22 23:14:39