gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:44:57 25 4
gpt4 key购买 nike

我正在运行一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com