2012-03-22 56 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