2013-12-09 47 views
1

我們的URL結構發展迅速,我們的日誌有時會填滿404個來自嘗試訪問舊的,不存在的URL的用戶錯誤。我想保持日誌清潔,並避免向用戶顯示404頁面。有沒有辦法設置「後備」路線,以便如果沒有找到操作,則用戶登錄到控制器的索引(或除錯誤頁面以外的任何地方)。CakePHP:如何創建路由「回退」

我知道如何有條件地手動連接路線。這就是我們迄今爲止一直在管理這個問題的方式,但這是一項勞動密集型工作,因爲每當URL結構發生變化時我們都需要添加一個新的。

例:

Router::connect('/old/url/:param', array('controller' => 'new', 'action' => 'index'), array('param' => '.*[^0-9/]+.*')); 

這將是一個容易得多,如果我們可以做這樣的事情:

Router::connect('/some_controller/ + ...anything that doesnt exist', array('controller' => 'some_controller', 'action' => 'index')); 

這可能嗎?

更新

爲了澄清,我不是簡單地使用通配符的理由是這樣的:我需要連接/的URL重定向不都遵循相同的模式。爲了演示,這裏有一些網址,我試圖重定向...

example.com/a/b/ --> example.com/a/ 
example.com/a/b/34 --> example.com/a/ 
example.com/a/c/ --> example.com/a/ 

,但我不希望重定向這個...

example.com/a/d 

所以我的問題是不是由什麼解決Burzum建議如下(翻譯爲本示例):Router::redirect('/a/b/*' ...Router::redirect('/a/*' ...,因爲這會錯過應該作爲目標的鏈接或應該(分別)應該鏈接的鏈接。

當然,我可以爲每個想要定位的鏈接編寫新的連接/重定向路由,但避免這種麻煩是這個問題的關鍵。此外,這是一個完全「反應性」的解決方案,因爲我需要在檢查調試日誌並查看不存在的控制器/操作/的請求之後應用新路由。我試圖成爲主動和阻止我的日誌填補了壞的請求時,一些東西改變。

回答

0

See the book for redirect routing。我不打算複製和粘貼整個部分給你,所以我建議你閱讀鏈接。

根據你的評論,我假設你不明白答案或你有其他要求。您的問題聲明如下:

我們的URL結構已經迅速發展和我們的日誌有時 與404錯誤由用戶填寫了試圖達到的時候,不存在 網址

正確的解決方案這是爲了使用重定向和HTTP狀態301.以下部分摘自官方文檔,並修改了示例以幫助您理解它。

重定向路由允許您發送HTTP狀態30x重定向到 傳入路由,並將它們指向不同的URL。當您想要通知客戶端應用程序資源已移動,並且您不希望爲相同內容公開兩個URL時,此功能很有用。

Router::redirect('/old/url/*', array('controller' => 'some', 'action' => 'index'), array('status' => 301)); 

Read about HTTP statuses, mostly 301

HTTP響應永久移動狀態碼301用於 永久重定向,這意味着使用URL 了301永久移動響應收到應 更新,在所提供的新的URL當前鏈接或記錄響應的位置字段。 此狀態碼應與位置標題一起使用。 RFC 2616 指出:

  • 如果客戶端鏈接編輯功能,它應該更新請求URI的所有引用。
  • 響應是可以緩存的。
  • 除非請求方法是HEAD,否則實體應該包含一個帶有指向新URI的超鏈接的小超文本記錄。
  • 如果收到301狀態代碼以響應除GET或HEAD以外的任何類型的請求,則客戶端必須在重定向之前詢問用戶。

更新:

此外,它是在一個完全「被動」解決方案,我需要檢查調試日誌,看到請求 不存在的控制器/動作之後申請新 路線/。

那麼,這應該是一個有限的行動。所以,你必須向他們聲明所有,至少爲每個控制器,並確保它的一組動作一致:

Router::redirect('/a/:action/*', array('controller' => 'some', 'action' => 'index'), array('status' => 301, 'action' => 'action1|action2')); 

如果你要匹配你必須找到一種方式更具體的網址可以匹配,或者你必須聲明每個路由/重定向。

example.com/a/b/34

這看起來更像是一個特定的記錄沒有被發現了。你應該有一個方法試圖獲取數據,在你的(希望)模型方法中拋出一個NotFoundException異常,並在控制器中捕獲它並使用$ this-> redirect(array(...),301);重定向他們。

爲什麼你應該使用301個狀態的重定向在路線的另一個原因是SEO:如果你只是連接了相同的內容幾個網址,你會得到很可能這從大多數搜索引擎產生負面影響。

+0

我想你可能誤解了我的問題。我已經知道如何重定向/連接路線。我不打算複製並粘貼我的整個問題,所以我建議你重讀這個問題。 – emersonthis

+0

我的答案是「嘗試訪問舊的,不存在的URL!」的正確答案!因爲在這種情況下,您應該執行狀態爲301(永久移動)的重定向。另一部分只需使用通配符/ some_controller/*。請參閱路由文檔。 – burzum

+0

我已經閱讀過您的問題兩次,我建議*您*閱讀我的答案以及兩次。這絕對是解決您的問題的最佳選擇。只需在重定向路線中使用通配符...讓我用勺子餵你。 – burzum