Ruby on Rails中的路由区分大小写。似乎有人在此之前提出了这个问题,而且它已被标记为无法修复。
http://rails.lighthouseapp.com/projects/8994/tickets/393-routes-are-case-sensitive
这令我感到不幸,因为我并不认为我自己申请路由区分大小有任何好处,而在不利方面它会造成混淆的可能性以及我认为缺乏修饰的普遍表现
使我的路线不区分大小写的最佳方法是什么?
我在Google搜索中找到了这个提示:
map.connect "web_feeds/:action", :controller => 'web_feeds', :action => /[a-z_]+/i
这很聪明,但它仍然使网址的web_feeds部分区分大小写。我没有看到任何类似的方法,但是,没有手动输入每个可能的wEb_feEds组合,但由于各种原因,这显然是一个可怕的解决方案。
答案 0 :(得分:11)
Rails中的路由区分大小写,因为URL区分大小写。来自W3C:
网址通常区分大小写 (机器名称除外)。 可能有网址或部分网址, 如果情况无关紧要,但是 识别这些可能并不容易。 用户应始终考虑该URL 区分大小写。
答案 1 :(得分:7)
我遇到了同样的问题,并使用中间件解决了问题 - 请看一下:
http://gehling.dk/2010/02/how-to-make-rails-routing-case-insensitive/
注意:这仅适用于Rails 2.3 +
答案 2 :(得分:3)
你可以尝试另一种方法。使案例转换为服务器端并将所有内容发送到rails downcase。
我认为你可以使用mod_rewrite或mod_spelling实现这一点。
答案 3 :(得分: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
答案 4 :(得分: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
答案 5 :(得分:0)
虽然URL区分大小写,但如果您想让路由不区分大小写,那么您可以做一些肮脏的黑客攻击。
在application_controller.rb中输入:
rescue_from ActionController::RoutingError do |exception|
redirect_to request.url.downcase
end
但实际上并没有这样做。您可以为任何不存在的路由创建重定向循环。你真的应该将request.request_uri解析为它的组件,对它们进行整理,并使用它们来生成你重定向到的合法路由。正如我刚才提到的,这是一个肮脏的黑客。但是,我认为这比让路线图变得丑陋和黑客更好。