2010-02-18 60 views
9

Ruby on Rails中的路徑區分大小寫。看起來有人在之前提出過這個問題,而且它已被標記爲無法修復。Rails路由 - 如何使它們不區分大小寫?

http://rails.lighthouseapp.com/projects/8994/tickets/393-routes-are-case-sensitive

這在我看來是不幸的,因爲我真的沒有看到任何上攻對我自己申請的路線是大小寫敏感的,而在下跌它創建了一個混亂和潛在的大體外觀我認爲缺乏拋光。

什麼是使我的路線不區分大小寫的最佳方法?

我發現谷歌搜索這個提示:

map.connect "web_feeds/:action", :controller => 'web_feeds', :action => /[a-z_]+/i 

這是聰明的,但它仍然留下的網址區分大小寫的web_feeds部分。然而,我沒有看到任何類似的方法,但是,沒有手動輸入wEb_feEds的每個可能的組合,但是由於許多原因,這顯然是可怕的解決方案。

回答

7

我剛剛有同樣的問題,並解決了使用中間件它 - 看看這裏:

http://gehling.dk/2010/02/how-to-make-rails-routing-case-insensitive/

注:這僅適用於Rails的2.3+

  • 卡斯滕
+0

上述解決方案並沒有爲Rails 3工作,但我現在已經解決了這個問題。 – 2010-11-06 12:44:50

+0

我終於把它變成了一個寶石,所以它使用起來更加簡單:https://rubygems.org/gems/route_downcaser – 2013-01-06 10:47:38

+0

如果你在Mixed Case中有一些資產/圖像名稱,這個解決方案是有問題的。 例如,如果您已經使用assets/images/ABc_xyZZ.png(Mixed Case)中的圖像,那麼在使用此解決方案後,它將嘗試在assets/images/abc_xyzz.png(小寫)和服務器將回應404找不到。 – 2013-04-17 08:06:24

11

Rails中的路由區分大小寫,因爲URL區分大小寫。來自W3C

網址一般區分大小寫 (機器名除外)。 可能存在URL或部分URL, 這裏的情況並不重要,但 識別這些可能並不容易。 用戶應始終考慮URL 區分大小寫。

+0

有趣,不知道。 – Davy8 2010-02-18 20:37:14

+0

我認爲,如果Web開始在Windows上,那麼它可能不會那樣! – 2010-02-18 20:49:22

+17

我很欣賞這樣一個事實,即有時候能夠區分案例很重要(儘管坦率地說我能想到的唯一例子是角落案例),但對於普通用法,這違背了用戶的期望。用戶期望stackoverflow.com/questions與stackoverflow.com/Questions相同,事實上,情況就是如此。我不確定普通用戶是否會考慮W3C的建議,認爲他們「應該始終認爲URL是區分大小寫的」。 – 2010-02-18 23:28:17

3

那麼你可以嘗試另一種方法。讓案例轉換爲服務器端,並將所有內容發送給用戶。

我認爲你可以用mod_rewrite或mod_spelling來實現這一點。

0

雖然URL是區分大小寫的,但如果您想使路由不區分大小寫,那麼您可以執行一些骯髒的攻擊。

在application_controller.rb地說:

rescue_from ActionController::RoutingError do |exception| 
redirect_to request.url.downcase 
end 

但實際上並不這樣做。您爲任何不存在的路線創建重定向循環。你真的應該將request.request_uri解析爲它的組件,將它們壓縮,然後用它們來生成你重定向到的合法路由。正如我剛纔提到的,這是一個骯髒的黑客攻擊。不過,我認爲這比讓你的路線圖變得醜陋和駭人聽聞更好。

+3

您應該檢查它是否已經downcased,像 如果request.url!= request.url.downcase redirect_to的request.url.downcase 其他 #顯示404文件 結束 – vise 2010-02-19 09:36:52

2

只是猴子補丁默認情況下。簡單的例子:

module ActionController 
    module Caching 
    module Pages 
     def cache_page(content = nil, options = nil) 
     return unless perform_caching && caching_allowed 

     path = case options 
      when Hash 
      url_for(options.merge(:only_path => true, :skip_relative_url_root => true, :format => params[:format])) 
      when String 
      options 
      else 
      request.path 
     end 

     path = path.downcase 

     self.class.cache_page(content || response.body, path) 
     end 
    end 
    end 
end 
+0

作爲W3C狀態URL是區分大小寫的 – 2010-06-21 15:47:59

2

一個簡單的解決方案是,也可以不是一個優雅的方式,但還沒有可行的是:在 像這樣的應用程序控制器使用的before_filter。

before_filter :validate_case 

    def validate_case 
    if request.url != request.url.downcase 
     redirect_301_permanent_to request.url.downcase 
    end 
    end 

    def redirect_301_permanent_to(url) 
    redirect_to url, :status=>:moved_permanently 
    end 

正如我已經告訴過,它不是一個優雅,但可行,所以沒有倒票。 :P

+0

最好在Rack上做。在應用程序控制器中,您已經通過Rails的路由調度程序。 – 2015-10-09 22:36:09