JS中的URL编码,用于有意义的URL和Rails页面缓存

Ole*_*ann 2 javascript caching escaping ruby-on-rails urlencode

我正在运行一个Rails应用程序,此时会获得大量流量,因此我开始使用页面缓存来提高性能.到目前为止,一切都像一个魅力.但是当我试图缓存搜索结果时,我遇到了一个奇怪的问题.

我的方法:

  • 使用有意义的网址进行搜索和分页(/ search?query = term&page = 3变为/ search/term/3)
  • 使用Javascript提交表单 - 如果JS被禁用,它将回退到旧表单(这也适用于我的路由,但没有缓存)

我的代码:

// Javascript
function set_search_action() {
  window.location = '/search/' + escape(document.getElementById('query').value);
  return false;
}

// HTML
<form action="/search" id="search_form" method="get" onSubmit="return set_search_action();">
  <input id="query" name="query" title="Search" type="text" />
  <input class="submit" name="commit" type="submit" value="Search" />
</form>
Run Code Online (Sandbox Code Playgroud)

问题

一切都适用于单词,如"term".但是当我搜索"term1 term2"时,表单将提交到/ search/term1 term2 // search/term1 term2/1.它应该提交到/ search/term1 + term2这就是我认为JS转义函数应该做的事情.

到目前为止,它也适用于开发模式中的空间.但我想在启用缓存的生产模式下它将成为一个问题(URL不应包含任何空格).

关于我做错了什么的任何想法?谢谢!

bob*_*nce 6

它应该提交到/ search/term1 + term2

不.Plus符号仅表示application/x-www-form-urlencoded内容中的空格,例如,当URL的查询字符串部分用于提交表单时.在URL的路径部分,+只是意味着加; 空间应编码为%20.

这就是我认为JS转义功能应该做的事情.

是的,这就是问题所在.escape对空间进行编码+,仅适用于表单提交; 在路径中使用,您将获得意外和不需要的加号.它还将非ASCII字符转换为特定于escape没有URL解码器能够读取的函数的任意格式.

正如Tomalak所说,escape()/ unescape()几乎总是错误的,一般不应该使用.encodeURIComponent()通常是你真正想要的,并且会%20为空间生成,这是安全的,因为它在路径部分或查询字符串中同样有效.