javascript - JS 中的 URL 编码以获得有意义的 URL 和 Rails 页面缓存

标签 javascript ruby-on-rails caching escaping urlencode

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

我的方法:

  • 使用有意义的 URL 进行搜索和分页(/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>

问题

一切都适用于像“术语”这样的单个词。但是当我搜索“term1 term2”时,表单被提交到 /search/term1 term2//search/term1 term2/1 。应该提交到/search/term1+term2 我觉得JS转义函数应该是这样的

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

对我做错了什么有什么想法吗?谢谢!

最佳答案

It should be submitted to /search/term1+term2

没有。加号仅表示 application/x-www-form-urlencoded 内容中的空格,例如当 URL 的查询字符串部分用于提交表单时。在 URL 的路径部分,+ 仅表示加号;空格应该编码为 %20

That's what the JS escape function should do I think.

是的,这就是问题所在。 escape将空格编码为+,只适用于表单提交;在路径中使用,你会得到一个意想不到的和不需要的加号。它还将非 ASCII 字符转换为特定于 escape 函数的任意格式,任何 URL 解码器都无法读取这种格式。

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

关于javascript - JS 中的 URL 编码以获得有意义的 URL 和 Rails 页面缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2929291/

相关文章:

javascript - 计算器的脚本计算范围错误

javascript - 为什么数据没有显示在react-bootstrap-table中?

ruby-on-rails - 弃用警告 : alias_method_chain is deprecated

mysql - 增加键的数量是否会影响 memcached 的性能?

caching - Redis 缓存关系数据的正确策略

javascript - 连接 javascript 和 html

javascript - 选择 "Other"时下拉添加输入

ruby-on-rails - 如何在 Rails 下拉菜单中设置默认选定项?

caching - 实现缓存被认为是一个难题吗?

javascript - 使用 v-model 改变 prop 的属性是不好的做法吗?