2011-05-14 50 views
1

我已經繼承了一個包含數百個分散的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?

編輯:澄清,這裏是事件的順序:

  1. 用戶點擊如http傳統路徑://mysite/foo.php可能是由來自博客的一些古老的鏈接來。
  2. ...但foo.php不再存在!
  3. 這是一個404,從而Apache的調用的ErrorDocument
  4. 指令是 「的ErrorDocument 404/railsapp /錯誤/ handle404」
  5. 導軌路由這個給ErrorController行動 「handle404」 - 這是正常工作
  6. 問題:在ErrorController中,request.request.uri,request.headers沒有提供任何關於用戶實際嘗試訪問哪個URL的線索,如「/foo.php」;我需要知道原始URL才能提供合適的替換頁面。
+0

你的Q有點冗長,我真的不明白你在問什麼。在rails路徑中,你可以匹配通配符路由,但是這不是一個ruby-on-rails問題,即使它被標記爲一個嗎? – oma 2011-05-14 20:34:40

+0

導軌佈線按預期工作;但Rails只會以「/ app」開頭的uris來回答。該虛擬目錄之外是一個PHP應用程序,該應用程序正在逐步遷移到Rails。我希望404處理程序針對缺少的PHP文件進行回答,並通過「ErrorDocument 404/app/error/handle404」將這些文件發送給Rails。這有效 - 除了當ErrorController動作句柄404實際運行時,它無法看到原始URL是什麼,因此無法弄清楚如何處理丟失的頁面。 – 2011-05-15 03:10:25

+0

rails應用程序能做什麼?誰負責提供信息,php和/或apache?我建議你重寫這個問題,並有更多的代碼和配置,如果我要花更多的時間。 – oma 2011-05-15 14:32:01

回答

0

因爲我在Rails請求中找不到原始的,未重寫的URL,所以我最終在PHP中使用顯式mysqli _ *()調用進行了簡單的,老式的非框架PHP。

PHP錯誤處理程序接收$ _SERVER散列中的必要信息; $ _SERVER ['REQUEST_URI']包含我需要的原始URI。

我在數據庫中查看,如果找到相應的條目,則發出301重定向到新的位置;如果沒有條目,我只需向用戶顯示一個404頁面。

簡體(PHP):

$url = $_SERVER['REQUEST_URI']; 
$redir = lookupRedirect($url); # database stuff here 
if (! $redir) { 
    include ('404.phtml'); 
} else { 
    header("Status: 301"); 
    header("Location: " . $redir['new_url']); 
} 

這是一個醜陋克魯格,但我不能找到一種方法,讓Rails應用程序知道錯誤的URL。