查詢字串是統一資源定位符 URL 的一部分，用於將值分配給指定的引數。查詢字串通常包括由 Web 瀏覽器或其他客戶端應用程式新增到基本 URL 的欄位，例如作為 HTML 文件的一部分、選擇頁面的外觀或跳轉到多媒體內容中的位置。 Web 伺服器可以透過基於 URL 路徑從其檔案系統讀取檔案或使用特定於資源型別的邏輯處理請求來處理超文字傳輸協議 HTTP 請求。在呼叫特殊邏輯的情況下，查詢字串以及 URL 的路徑元件將可供該邏輯在其處理中使用。 結構 包含查詢字串的典型 URL 如下： 當伺服器收到對此類頁面的請求時，它可以執行一個程式，將查詢字串（在本例中為 nameferret）傳遞給該程式，不做任何更改。問號用作分隔符，不是查詢字串的一部分。 Web 框架可能提供用於解析查詢字串中的多個引數的方法，這些引數由某些分隔符分隔。在下面的示例 URL 中，多個查詢引數由與號 分隔： 查詢字串的確切結構尚未標準化。用於解析查詢字串的方法可能因網站而異。 網頁中的連結可能具有包含查詢字串的 URL。HTML 定義了使用者代理生成查詢字串的三種方式： 透過元素生成 HTML 表單 透過元素上的屬性和構造的伺服器端影像對映 透過現已棄用的元素進行索引搜尋 網頁表單 最初的用途之一是包含 HTML 表單（也稱為 Web 表單）的內容。特別地，當提交包含欄位 field1 field2 field3 的表單時，欄位的內容被編碼為查詢字串，如下所示： 查詢字串由一系列 欄位 值 對組成。 在每對中，欄位名稱和值由等號 分隔。 該系列的 欄位 值 對由與號 分隔（W3C 不再推薦使用分號 ，請參見下文）。 雖然沒有明確的標準，但大多數 Web 框架允許多個值與單個欄位關聯（例如 field1value1field1value2field2value3）。 對於表單的每個欄位，查詢字串包含一對 fieldvalue。 Web 表單可能包含使用者不可見的欄位； 提交表單時，這些欄位將包含在查詢字串中。 該約定是 W3C 的建議。Forms in HTML documents W3org Retrieved on 20130908 在 1999 年的建議中，W3C 建議所有 Web 伺服器除了 符號分隔符之外還支援分號分隔符 Performance Implementation and Design Notes W3org Retrieved on 20130908，以允許 HTML 文件的 URL 中的 applicationxwwwformurlencoded 查詢字串，而無需對 符號進行實體轉義。自 2014 年起，W3C 建議僅使用 符號作為查詢分隔符。 當表單提交方法為 GET 時，表單內容僅編碼在 URL 的查詢字串中。當提交方法為 POST 時，預設使用相同的編碼，但結果作為 HTTP request body 提交，而不是包含在修改後的 URL 中。 索引搜尋 在將表單新增到 HTML 之前，瀏覽器將元素呈現為單行文字輸入控制元件。輸入到此控制元件中的文字作為查詢字串傳送到伺服器，附加到對基本 URL 或屬性指定的另一個 URL 的 GET 請求。這樣做的目的是允許 Web 伺服器使用提供的文字作為查詢條件，以便它們可以返回匹配頁面的列表。 當輸入到索引搜尋控制元件的文字被提交時，它被編碼為查詢字串，如下所示： 查詢字串由一系列引數組成，透過將文字解析為該空間處的單詞。 該系列由加號 分隔。 儘管元素已被棄用，並且大多數瀏覽器不再支援或呈現它，但仍然存在索引搜尋的一些痕跡。 例如，這就是瀏覽器 URL 的百分號編碼中加號 特殊處理的來源（如今，隨著索引搜尋的棄用，20 幾乎是多餘的）。此外，如果查詢字串不包含等號 （根據 CGI 11 的第 44 節），一些支援 CGI 的 Web 伺服器（例如 Apache）會將查詢字串處理為命令列引數。一些 CGI 指令碼仍然依賴並使用這種歷史行為來嵌入 HTML 中的 URL。 URL 編碼 有些字元不能是 URL 的一部分（例如空格），而其他一些字元在 URL 中具有特殊含義：例如，字元 可用於進一步指定文件的小節（或片段）。在 HTML 表單中，字元 用於分隔名稱和值。URI 通用語法使用 URL 編碼來處理此問題，而 HTML 表單會進行一些額外的替換，而不是對所有此類字元應用百分比編碼。 HTML5 指定以下轉換，用於使用 GET 方法向 Web 伺服器提交 HTML 表單。以下是該演算法的簡要總結： 無法轉換到正確字元集的字元將替換為 HTML 字元值引用 空格被編碼為 或 20。 字母（AZ 和 az）、數字 09 和字元 and _ 保持原樣 由 2B 編碼 所有其他字元均編碼為 HH 十六進位制表示形式，任何非 ASCII 字元首先編碼為 UTF8（或其他指定的編碼） RFC 3986 允許在查詢字串中使用與波浪號相對應的八位位元組，但需要在 HTML 表單中將其百分比編碼為 7E。 將 SPACE 編碼為 或者選擇 原樣 表示該字元，這是 HTML5 編碼與 RFC 3986 的差異。 例子 把如下表單遷入 HTML 網頁 form actioncgibintestcgi methodget input typetext namefirst input typetext namesecond input typesubmit form 使用者在兩個文字輸入框中寫入字串 this is a field 和 it clear 並按提交按鈕，程式 testcgi（上例中由 form 元素的 action 屬性指定的程式）將收到以下查詢字串：firstthisisafieldsecondwasitclear28already293F 如果表單由 CGI 指令碼在伺服器上處理，則該指令碼通常可以將查詢字串作為名為 QUERY_STRING 的環境變數接收。 跟蹤使用者狀態 接收查詢字串的程式可以忽略部分或全部查詢字串。如果請求的 URL 對應於檔案而不是程式，則忽略整個查詢字串。但是，無論是否使用查詢字串，包括它的整個 URL 都會儲存在伺服器日誌檔案中。 這些事實允許使用查詢字串以類似於 HTTP cookie 提供的方式跟蹤使用者。為此，每次使用者下載頁面時，都必須選擇一個唯一識別符號並將其作為查詢字串新增到該頁面包含的所有連結的 URL 中。一旦使用者點選其中一個連結，就會向伺服器請求相應的 URL。這樣，本頁的下載就與上一頁連結起來了。 例如，當請求包含以下內容的網頁時： a hreffoohtmlsee my pagea a hrefbarhtmlmine is bettera 選擇一個唯一的字串，例如 e0a72cb2a2c7，並將頁面修改如下： a hreffoohtmle0a72cb2a2c7see my pagea a hrefbarhtmle0a72cb2a2c7mine is bettera 新增查詢字串不會改變頁面向用戶顯示的方式。例如，當用戶點選第一個連結時，瀏覽器會向伺服器請求頁面 foohtmle0a72cb2a2c7，而伺服器會忽略？後面的內容並按預期傳送頁面 foohtml，同時將查詢字串新增到其連結中。 這樣，來自該使用者的任何後續頁面請求都將攜帶相同的查詢字串 e0a72cb2a2c7，從而可以確定所有這些頁面已被同一使用者檢視。 查詢字串通常與網路信標結合使用。 用於跟蹤的查詢字串和 HTTP cookie 之間的主要區別是： 查詢字串構成 URL 的一部分，因此如果使用者儲存 URL 或將 URL 傳送給其他使用者，查詢字串也會包含在內；cookie 可以跨瀏覽會話進行維護，但不會與 URL 一起儲存或傳送。 如果使用者透過兩個（或多個）獨立路徑到達同一個 Web 伺服器，它將被分配兩個不同的查詢字串，而儲存的 cookie 是相同的。 使用者可以停用 cookie，在這種情況下，使用 cookie 進行跟蹤將不起作用。但是，使用查詢字串進行跟蹤應該適用於所有情況。 不同的頁面訪問所傳遞的不同查詢字串將意味著頁面永遠不會從瀏覽器（或代理，如果存在）快取中獲取服務，從而增加 Web 伺服器上的負載並降低使用者體驗。 相容性問題 根據 HTTP 規範：HTTP11 Message Syntax and Routing ietforg Retrieved on 20140731 在實踐中發現了對請求行長度的各種臨時限制。建議所有 HTTP 傳送方和接收方至少支援 8000 個八位位元組的請求行長度。 如果 URL 太長，Web 伺服器將失敗並顯示 HTTP 狀態碼：414 RequestURI Too Long。 這些問題的常見解決方法是使用 POST 而不是 GET 並將引數儲存在請求體中。請求體的長度限制通常遠高於 URL 長度的長度限制。例如，預設情況下，POST 大小限制在 IIS 40 上為 2 MB，在 IIS 50 上為 128 KB。該限制在 Apache2 上可使用 LimitRequestBody 指令進行配置，該指令指定請求體中允許的從 0（表示無限制）到 2147483647 2 GB 的位元組數。core Apache HTTP Server Httpdapacheorg Retrieved on 20130908 參見 URI fragment URL Uniform Resource Locator Clean URL Click identifier Common Gateway Interface CGI HTTP cookie 超文字傳輸協議 HTTP Semantic URL URI scheme 網路信標 參考文獻 CategoryURL Category 字串