Rails 3查询string

非常奇怪的错误在这里。 我们正确地得到了类似“/ users / 8788234”的请求

在Rails中,我们称之为:

redirect_to(:controller => 'login', :from_external_page => true, :on_login => request.env['REQUEST_URI']) and return 

我们在Rails日志中看到(如我们所期望的):redirect到

 https://sampleapp.com/login?from_external_page=true&on_login=%2Fusers%2F8788234 

但是接下来,我们从IP中看到的请求具有查询string置乱的值:

 Started GET "/login?from_external_page=gehr&on_login=%2Shfref%2S8788234" for xx.xxx.xxx.xxx at yyyy-mm-dd 

这两个都使查询string值无意义,并导致以下错误:

 ArgumentError: invalid %-encoding 

(%2F更改为%2S,这是无效的)。 查询string中每个键值对的每个值都被移动了13个字符。 每当我们看到这个,用户代理读取:“Mozilla / 5.0(compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0)”,但我们也看到用户代理成功地导航应用程序。 有没有人见过这样的事情? http://www.whatismybrowser.com/告诉我,这个用户代理是在Windows 7上运行的IE9,但我们一直没有能够重现的错误。

这当然是编码问题。 我现在正在使用Rails 4,下面是我当前项目的示例查询字符串。 请注意查询字符串中的第一个参数是“utf8 =✓”,在查询字符串中缺少。

 profiles?utf8=✓&min_age=1&max_age=99&min_height=1&max_height=6&min_weight=1&max_weight=400 

尝试添加“#编码:UTF-8在文件的开头”

如果任何人都好奇,我最终只是为嵌套的查询字符串编写一个中间件解析器,如果13个字符的转换将使其有效,则会将其旋转回13个字符。 我不打算接受它作为答案,希望有人可能真的能够回答它。 无论如何,这是我的方法:

 # used to parse out invalid query strings, attempt to fix them, and # handle the resulting query appropriately class InvalidEncodingParser # creates the middleware instance with a reference to the application def initialize(app) @app = app end # parse out bad queries, attempt to fix def call(env) begin # no need to scrub_nested_query if QUERY_STRING is blank or unescapable env['QUERY_STRING'].blank? or Rack::Utils.unescape(env['QUERY_STRING']) rescue ArgumentError env['QUERY_STRING'] = scrub_nested_query(env['QUERY_STRING']) end @app.call(env) end private # attempts to unescape both the query params and rot13 of the query params def scrub_nested_query(query_string = '') params = [] (query_string || '').split(/[&;] */n).each do |param| if valid_query_param?(param) params << param elsif valid_query_param?(rotate_13_characters(param)) params << rotate_13_characters(param) else raise ArgumentError end end params.join('&') end # applies a caesar cipher with a shift of 13 characters to the value of the # query key, value pair if the given param contains an equal sign def rotate_13_characters(param) key, value = param.split('=', 2) value.nil? ? param : (key + '=' + value.tr('A-Za-z', 'N-ZA-Mn-za-m')) end # attempts to unescape the param, returns false if it fails def valid_query_param?(param) param.blank? or Rack::Utils.unescape(param).present? rescue ArgumentError false end end 

…然后把下面的我的application.rb文件的底部

 # Use invalid encoding middleware to parse out invalid encodings in the query string # of the url and handle them appropriately config.middleware.insert_before(ActionDispatch::ParamsParser, 'InvalidEncodingParser')