我已經繼承了一個包含數百個分散的HTML和非框架PHP文件的站點,我將它們移植到Ruby on Rails 3.0中。非導軌URL的Rails 404處理程序
隨着Rails應用程序添加了功能,相應的頁面將從文檔根目錄中刪除;但是,由於在Google或外部網站中經常存在這些鏈接,因此僅返回404是不可接受的。
例如,像'/contact.php'這樣的URL應該重定向到'/ app/contact /'。
對於這種情況的前幾種情況,我在舊位置創建了簡單的存根html文件,其中的Meta標籤用於執行重定向。這不能很好地擴展,特別是一旦我開始替換其中有成千上萬的產品頁面。
我的首選是刪除舊頁面,然後讓404處理程序將它們分派給新的Rails應用程序,該應用程序將使用正則表達式和數據庫查找來檢查URL以試圖找出替換頁面,然後發出301重定向到該新頁面。
在httpd.conf中,我把指令:
ErrorDocument 404 /app/error/handle404
# /app/error is a rails url.
當我打的「http://本地主機/不 - 不存在」,這使我的ErrorController被調用,符合市場預期。但是,在控制器內部,我無法在request,request.headers或ENV中的任何位置找到原始路徑(「/ does-not-exist」) - 我一直在調用可能的方法,如request.request_uri(它包含/ app/error/handle404),並檢查request.headers和ENV,但未找到預期的原始路徑。
Apache access_log只顯示/ does-not-exist的請求,表明它透明地調用了/ app/error/handle404(沒有做重定向或導致第二個請求)。
我該如何訪問原始URL?
編輯:澄清,這裏是事件的順序:
- 用戶點擊如http傳統路徑://mysite/foo.php可能是由來自博客的一些古老的鏈接來。
- ...但foo.php不再存在!
- 這是一個404,從而Apache的調用的ErrorDocument
- 指令是 「的ErrorDocument 404/railsapp /錯誤/ handle404」
- 導軌路由這個給ErrorController行動 「handle404」 - 這是正常工作
- 問題:在ErrorController中,request.request.uri,request.headers沒有提供任何關於用戶實際嘗試訪問哪個URL的線索,如「/foo.php」;我需要知道原始URL才能提供合適的替換頁面。
你的Q有點冗長,我真的不明白你在問什麼。在rails路徑中,你可以匹配通配符路由,但是這不是一個ruby-on-rails問題,即使它被標記爲一個嗎? – oma 2011-05-14 20:34:40
導軌佈線按預期工作;但Rails只會以「/ app」開頭的uris來回答。該虛擬目錄之外是一個PHP應用程序,該應用程序正在逐步遷移到Rails。我希望404處理程序針對缺少的PHP文件進行回答,並通過「ErrorDocument 404/app/error/handle404」將這些文件發送給Rails。這有效 - 除了當ErrorController動作句柄404實際運行時,它無法看到原始URL是什麼,因此無法弄清楚如何處理丟失的頁面。 – 2011-05-15 03:10:25
rails應用程序能做什麼?誰負責提供信息,php和/或apache?我建議你重寫這個問題,並有更多的代碼和配置,如果我要花更多的時間。 – oma 2011-05-15 14:32:01