Contents

有關GET POST 傳輸內容

在開發 Web 應用時,GET 和 POST 是最常用的兩種 HTTP Method。很多人(包括我自己)曾誤以為 GET 和 POST 都有嚴格的長度限制,但深入了解後才發現,這個觀念並不完全正確。

HTTP 規範怎麼說?

HTTP 規範本身並未規定 GET 或 POST 的資料長度上限。 長度限制是來自於瀏覽器、Web 伺服器或 Proxy 伺服器的實作,而非 HTTP 協議本身。

GET 的長度限制

GET 的參數附加在 URL 後面(Query String),因此受到 URL 長度限制

瀏覽器/伺服器 URL 長度上限(近似值)
Chrome 約 8,000 字元
Firefox 約 65,536 字元
IE / Edge 約 2,048 字元
Apache 約 8,192 字元(可調整)
Nginx 約 4,096 字元(可調整)

實務上,為了相容性,建議 URL 不超過 2,000 字元

POST 的長度限制

POST 的資料放在 HTTP Request Body 中,HTTP 規範並未限制大小,但伺服器端通常會設定上限

1
2
3
4
5
6
7
8
9
# Apache 設定(httpd.conf)
LimitRequestBody 10485760   # 10MB

# Nginx 設定(nginx.conf)
client_max_body_size 10m;   # 10MB

# PHP 設定(php.ini)
post_max_size = 8M
upload_max_filesize = 2M

GET 與 POST 的語義差異

長度限制只是技術面,更重要的是語義差異

安全性(Safe)

GET 是「安全的」操作,表示它不應修改伺服器上的資料,只用於讀取。POST 則可能修改資料。

冪等性(Idempotent)

GET 是冪等的——多次執行同一請求,結果相同。POST 不是冪等的——多次提交可能產生不同結果(例如重複下訂單)。

快取

GET 請求可以被瀏覽器和 Proxy 快取;POST 預設不快取。

書籤與分享

GET 參數在 URL 中,可以加入書籤或分享連結;POST 資料無法直接分享。

選擇 GET 或 POST 的原則

1
2
3
4
讀取資料 → 用 GET
提交表單、新增/修改/刪除資料 → 用 POST(或 PUT/DELETE)
資料包含敏感資訊(密碼等) → 用 POST(不在 URL 中顯示)
資料量大(超過 2000 字元) → 用 POST

實際範例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<!-- GET:搜尋查詢(可書籤、可快取) -->
<form method="GET" action="/search">
  <input name="q" type="text">
  <button type="submit">搜尋</button>
</form>
<!-- 結果 URL:/search?q=關鍵字 -->

<!-- POST:登入表單(密碼不應出現在 URL) -->
<form method="POST" action="/login">
  <input name="username" type="text">
  <input name="password" type="password">
  <button type="submit">登入</button>
</form>

參考資料