2015-12-21 72 views
1

我目前正在運行的rails應用程序正在被黑客攻擊的前WordPress網站的域中運行。每過一段時間,我都會收到一個PUT的路由錯誤通知,該網站沒有,也不應該支持。顯然,我無法阻止這些請求被做出,但我想優雅地處理它們。在routes.rb中自動將PUT路由重定向到root_url

在我的路線文件我已經把所有未知的路徑重定向到root_url在本SO post on routing unknown requests的代碼說明:

match '*path' => redirect('/'),via: [:get, :post] unless Rails.env.development? 

即使如此,我仍然收到錯誤,如下所示:

ActionController::RoutingError: No route matches [PUT] "/cmyks42567.txt" 

如何在不寫入控制器來傳遞特定url和重定向的情況下在路由文件中重定向這個?

回答

1

我會親自處理這個與您的網絡服務器軟件。

如果你使用Apache,你可以使用類似:

#public/htaccess 
Options +FollowSymLinks 
RewriteEngine On 
RewriteRule ^*.txt$ http://example.com/ [R=301,L] 

如果你想處理它在Rails的路線,你可以使用一個redirect

#config/routes.rb 
unless Rails.env.development? 
    scope constraints: { format: 'txt' } do 
     match '*path', to: redirect('/'), via: [:get, :post, :put] 
    end 
end 

但是您必須確定您只捕獲只有您需要重定向的路線。

您的設置存在的問題是,它會捕獲您發送到應用程序的每條路線,並重定向到root。事實上,這可能最終導致無限的遞歸錯誤。

我上面的代碼只能用於生產/分段(和你的一樣)。

它通過任何.txt路由通過GET,POSTPUT HTTP動詞,重定向到根路徑。

1

你得到了它,只是改變:via選項[:put]

match '*path' => redirect('/'), via: [:put] unless Rails.env.development? 

根據Rails的指南(http://guides.rubyonrails.org/routing.html#http-verb-constraints):「你可以使用匹配方法與:通過選項來一次匹配多個動詞:「喲,你只寫匹配GET和POST請求的方式。

更改後您的代碼按預期工作。