2010-05-28 53 views
2

我正在運行一個Rails應用程序,該應用程序在此刻獲得大量流量,因此我開始使用頁面緩存來提高性能。到目前爲止,一切都像魅力一樣。但是當我試圖緩存搜索結果時,我遇到了一個奇怪的問題。在JS中對URL進行URL編碼以獲得有意義的URL和Rails頁面緩存

我的方法:

  • 用於搜索和分頁(?/檢索查詢的=項&頁= 3變/搜索/項/ 3)
  • 使用JavaScript來提交表單有意義的URL - 如果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不應包含任何空格)。

我做錯了什麼想法?謝謝!

回答

6

應當提交/搜索/字詞1 +詞條2

都能跟得上。 Plus符號僅代表application/x-www-form-urlencoded內容中的空格,例如URL的查詢字符串部分用於提交表單時。在URL的路徑部分,+只是意味着加;空間應該編碼爲%20

這就是我認爲的JS轉義函數應該做的。

是的,確實如此,這就是問題所在。 escape將空格編碼爲+,它僅適用於表單提交;在路徑中使用,你會得到一個意外和不需要的加號。它還將非ASCII字符轉換爲專用於escape函數的任意格式,即URL解碼器無法讀取。

As Tomalak說,escape()/unescape()幾乎總是錯誤的東西,一般不應該使用。encodeURIComponent()通常是您真正想要的,並且會爲空格生成%20,這是安全的,因爲它在路徑部分或查詢字符串中同樣有效。

+0

+1,以便詳細說明「%20」何時何地有效。 – Tomalak 2010-05-28 14:01:36

3

千萬不要使用escape()!它是破碎的,並且非常不推薦你做的事情。改爲使用encodeURIComponent()

要有+而不是%20,請附加.replace(/%20/g, "+")

+0

正如@bobince指出的,'+'只在查詢字符串中有效。即使在那裏,它也可以用'%20'代替而不會有任何問題。 – Tomalak 2010-05-28 14:04:24