recursal/MDN huggingface dataset:
識別網絡上的資源
========

HTTP 請求的目標被稱為「資源」，其性質並未進一步定義；它可以是一個文件、一張照片或其他任何東西。每個資源都由統一資源標識符（URI）識別，該 URI 在整個 HTTP 中用於識別資源。

URL 和 URN
---------

### URL

最常見的 URI 形式是統一資源定位符（URL），也稱為*網址*。


```url
https://developer.mozilla.org
https://developer.mozilla.org/zh-TW/docs/Learn/
https://developer.mozilla.org/zh-TW/search?q=URL
```


可以將任何一個 URL 輸入到瀏覽器的地址欄中，以告訴它加載相關的網頁（資源）。

URL 由不同的部分組成，一些是必需的，而其他是可選的。一個更複雜的例子可能如下所示：


```url
http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument
```

### URN

統一資源名稱（URN）是一個在特定命名空間中以名稱識別資源的 URI。


```url
urn:isbn:9780141036144
urn:ietf:rfc:7230
```


這兩個 URN 分別對應到：

* 《0984》一書，作者是喬治·奧威爾（George Orwell）。
* IETF 規範 7230，標題為「超文本傳輸協議（HTTP/1.1）：消息語法和路由」。
統一資源識別符的語法
----------

### 方案或協定

![協定](/zh-TW/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web/mdn-url-protocol@x2.png)

`http://` 是個協定（protocol），它指示瀏覽器應該使用哪種協定。通常情況下，這是 HTTP 協議或其安全版本 HTTPS。網頁需要使用這兩者之一，但瀏覽器也知道如何處理其他協定，比如 `mailto:`（用於打開郵件客戶端）或 `ftp:`（用於處理文件傳輸），所以如果你看到這些協定，也不要感到驚訝。一些常見的方案（scheme）包括：



| 方案 | 描述 |
| --- | --- |
| data | Data URL |
| file | 特定主機的文件名 |
| ftp | 文件傳輸協定 |
| http/https | 超文字傳輸協定（安全） |
| javascript | URL 中嵌入的 JavaScript 程式碼 |
| mailto | 電子郵件地址 |
| ssh | 安全外殼 |
| tel | 電話 |
| urn | 統一資源名稱 |
| view-source | 資源的源程式碼 |
| ws/wss | WebSocket 連接（安全） |

### 權威

![域名](/zh-TW/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web/mdn-url-domain@x2.png)

`www.example.com` 是域名或管理命名空間的權威，它指示正在請求的 Web 服務器。或者，也可以直接使用 IP 位址，但由於不太方便，因此在 Web 上很少使用。

### 通訊埠

![通訊埠](/zh-TW/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web/mdn-url-port@x2.png)

`:80` 是在這個示例中的通訊埠編號。它表示用於訪問 Web 服務器上的資源的技術「閘道」。通常，如果 Web 服務器使用 HTTP 協議的標準通訊埠（HTTP 的通訊埠為 80，HTTPS 的通訊埠為 443）來提供對其資源的訪問權，則可以省略它。否則，它是必需的。

### 路徑

![文件路徑](/zh-TW/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web/mdn-url-path@x2.png)

`/path/to/myfile.html` 是 Web 服務器上資源的路徑。在 Web 早期，這樣的路徑代表了 Web 服務器上的實際文件位置。如今，它主要是由 Web 服務器抽象的處理，並且沒有實際的物理存在。

### 查詢

![參數](/zh-TW/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web/mdn-url-parameters@x2.png)

`?key1=value1&key2=value2` 是提供給 Web 服務器的額外參數。這些參數是一個由 `&` 符號分隔的鍵/值對列表。Web 服務器可以使用這些參數在將資源返回給用戶之前執行額外的操作。每個 Web 服務器都有自己的參數處理規則，了解特定 Web 服務器如何處理參數的唯一可靠方法是請教 Web 服務器的所有者。

### 片段

![錨點](/zh-TW/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web/mdn-url-anchor@x2.png)

`#SomewhereInTheDocument` 是對資源本身的另一部分的錨點。錨點代表資源內的一種「書籤」，它告訴瀏覽器顯示位於該「書籤」位置的內容。例如，在 HTML 文件中，瀏覽器將滾動到定義錨點的位置；在視頻或音頻文件中，瀏覽器將嘗試跳轉到錨點代表的時間。值得注意的是，# 後面的部分，也稱為片段標識符，不會隨請求一起發送到服務器。

使用筆記
----

在 HTML 內容中使用 URL 時，通常只應該使用其中一些 URL 方案。當引用子資源（即作為較大文檔的一部分加載的文件）時，應僅使用 HTTP 和 HTTPS 方案。出於安全原因，越來越多的瀏覽器已經停用了使用 FTP 來加載子資源的支援。

FTP 在頂層（例如直接輸入到瀏覽器的 URL 欄中，或作為鏈接的目標）仍然可以接受，但一些瀏覽器可能將 FTP 內容的加載委派給另一個應用程序。

範例
--


```url
https://developer.mozilla.org/zh-TW/docs/Learn
tel:+1-816-555-1212
git@github.com:mdn/browser-compat-data.git
ftp://example.org/resource.txt
urn:isbn:9780141036144
mailto:help@supercyberhelpdesk.info
```

規範
--

| Specification |
| --- |
| HTTP Semantics # uri |

參見
--

* 什麼是 URL？ (en-US)
* IANA URI 方案列表
Connection
==========

**`Connection`** 標頭用來控制在本次事務（transaction）後，連線是否要繼續開著。如果設定為 `keep-alive` ，
 則連線繼續開著，讓接下來送往同一伺服器的請求利用。


**警告：** Connection 相關的標頭如 `Connection` 和
 `Keep-Alive` (en-US) 在 HTTP/2 中被禁用。
 Chrome 和 Firefox 會忽略 HTTP/2 回應中的這些標頭，不過 Safari 遵守 HTTP/2
 spec 的要求，不會讀取包含這些標頭的回應內容。


 除了標準的點對點標頭（hop-by-hop headers）（`Keep-Alive` (en-US) 、
 `Transfer-Encoding` (en-US) 、 `TE` (en-US) 、 `Connection` 、
 `Trailer` (en-US) 、 `Upgrade` (en-US) 、
 `Proxy-Authorization` (en-US) 以及 `Proxy-Authenticate` (en-US)），
 任何在 HTTP 事務中使用到的點對點標頭都必須在 `Connection` 標頭列出來，
 這樣首先經手請求的代理軟體才知道自己要處理這些標頭。標準的點對點標頭也是一樣的處理方式。


| Header type | General header (en-US) |
| --- | --- |
| Forbidden header name (en-US) | yes |

語法
--


```http
Connection: keep-alive
Connection: close
```

指令
--

`close`

 表示客戶端或伺服器想要關閉連線。
 通常用在 HTTP/1.0 。


一串用逗號分隔的 HTTP 標頭 [通常只設定為 `keep-alive` ]

 表示客戶端想要讓連線持續開著。HTTP/1.1 請求的預設行為就是維持連線開啟。
 至於那串用逗號分隔的 HTTP 標頭會被首先經手請求的代理軟體或快取軟體移除：因為這些標頭就是用來控制請求發起者與第一個代理軟體的連線行為，而不是請求的目標伺服器。


瀏覽器相容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
Content-Type
============

**`Content-Type`** 用來表示資源的 media type 。

在 HTTP 回應中，`Content-Type` 表頭是用來表示本次 HTTP 事務回傳的內容類型。瀏覽器有時會自己推測內容類型（MIME sniffing），如果要阻止這個行為，請在回應中設定 `X-Content-Type-Options` (en-US) 標頭為 `nosniff`。

在 HTTP 請求中（比如 `POST` (en-US) 或 `PUT` (en-US)），則是客戶端用來告訴伺服器自己傳的資料是什麼內容類型。

| Header type | Entity header (en-US) |
| --- | --- |
| Forbidden header name (en-US) | no |
| CORS-safelisted response header (en-US) | yes |
| CORS-safelisted request header (en-US) | yes, with the additional restriction that values can't contain a *CORS-unsafe request header byte*: 0x00-0x1F (except 0x09 (HT)), `"():<>?@[\]{}`, and 0x7F (DEL). It also needs to have a MIME type of its parsed value (ignoring parameters) of either `application/x-www-form-urlencoded`, `multipart/form-data`, or `text/plain`. |

語法
--


```http
Content-Type: text/html; charset=UTF-8
Content-Type: multipart/form-data; boundary=something
```

指令
--

`media-type`

資料的 內容類型（MIME type） (en-US)

charset

編碼標準。

boundary

對於多段的資料必須要使用 `boundary` 指令，由 1 到 70 字的字元組成（這樣做很適合寄信），而且不能以空白結束。它會用來標誌資料的每一個段落。通常第一個段落的前面會加上兩個破折號（-），而最後一個段落後面也會加上兩個破折號。

範例
--

### 在 HTML 表單設定 `Content-Type`

你可以在 HTML `<form>` (en-US) 的 `enctype` 屬性，設定表單送出後的 `POST` (en-US) 請求的 `Content-Type` 。


```html
<form action="/" method="post" enctype="multipart/form-data">
  <input type="text" name="description" value="some text" />
  <input type="file" name="myFile" />
  <button type="submit">Submit</button>
</form>
```


HTTP 請求大概長這樣（省略了一些不重要的標頭）：
```

POST /foo HTTP/1.1
Content-Length: 68137
Content-Type: multipart/form-data; boundary=---------------------------974767299852498929531610575

-----------------------------974767299852498929531610575
Content-Disposition: form-data; name="description"

some text
-----------------------------974767299852498929531610575
Content-Disposition: form-data; name="myFile"; filename="foo.txt"
Content-Type: text/plain

(content of the uploaded file foo.txt)
-----------------------------974767299852498929531610575--
```

Specifications
--------------

| Specification |
| --- |
| HTTP Semantics # status.206 |
| HTTP Semantics # field.content-type |

Browser compatibility
---------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

See also
--------

* `Accept`
* `Content-Disposition` (en-US)
* `206` Partial Content
* `X-Content-Type-Options` (en-US)
Age
===

**`Age`** 標頭代表資源進到代理快取後，經過了幾秒。

`Age` 標頭通常接近 0。如果你拿到 `Age: 0` 代表資源剛剛才從後端伺服器抓進來；
 不然通常會是快取當下與回應中 `Date` 標頭的時間差。


| Header type | Response header (en-US) |
| --- | --- |
| Forbidden header name (en-US) | no |

語法
--


```html
Age: <秒數差>
```

指令
--

<秒數差>

正整數，代表資源在代理快取放幾秒了。

範例
--
```

Age: 24
```

Specifications
--------------

| Specification |
| --- |
| HTTP Caching # field.age |

Browser compatibility
---------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

See also
--------

* `Cache-Control`
* `Expires` (en-US)
DNT
===

**`DNT`**（**D**o **N**ot **T**rack，**請勿追蹤**）請求標頭表明用戶針對追蹤程式的設定。它能讓用戶表達自己相較於個人化設定，更在乎個人隱私。

| 標頭類型 | Request header (en-US) |
| --- | --- |
| Forbidden header name (en-US) | 是 |

語法
--
```

DNT: 0
DNT: 1
```

指令
--

0

用戶允許目標網站追蹤之。

1

用戶不允許目標網站追蹤。

示例
--

### 請參考 JavaScript 的 Do Not Track

用戶的 DNT 設定也能透過 JavaScript 的 `Navigator.doNotTrack` (en-US) 設定檢查：


```js
navigator.doNotTrack; // "0" or "1"
```

規範
--

#### No specification found

No specification data found for `http.headers.DNT`.  
Check for problems with this page or contribute a missing `spec_url` to mdn/browser-compat-data. Also make sure the specification is included in w3c/browser-specs.

瀏覽器相容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

參見
--

* `Navigator.doNotTrack` (en-US)
* `Tk` (en-US) 標頭
* 維基百科的Do Not Track
* What Does the "Track" in "Do Not Track" Mean? – EFF
* donottrack.us
* 瀏覽器設定 DNT 的幫助：
    + Firefox
    + Chrome
X-Frame-Options 回應標頭
====================

`X-Frame-Options` HTTP 回應標頭 (header) 用來指示文件是否能夠透過 `<frame>` (en-US)、`<iframe>` (en-US) 以及 `<object>` (en-US) 載入。網站可以利用 `X-Frame-Options` 來確保本身內容不會遭惡意嵌入到其他網站、避免 clickjacking (en-US) 攻擊。

僅當訪問文件的用戶使用支持 `X-Frame-Options` 的瀏覽器時，才提供附加的安全性。

**備註：** 在支援的瀏覽器中，`Content-Security-Policy` (en-US) 的 `frame-ancestors` (en-US) 指令標準已經取代了非標準的 `X-Frame-Options`。

使用 X-Frame-Options
------------------

共有三種值：

`DENY`

表示網頁無論如何都無法被嵌入到 frame 中，即使於相同網域內嵌入也不允許。

`SAMEORIGIN`

唯有當符合同源政策下，才能被嵌入到 frame 中。

`ALLOW-FROM uri` 
已棄用

唯有列表許可的 URI 才能嵌入到 frame 中。新版瀏覽器已不再支援此指令。

### 設定 Apache

請加入以下指令到網站組態設定檔：
```

Header always append X-Frame-Options SAMEORIGIN
```

### 設定 nginx

請加入以下指令到 http, server 或 location 組態設定檔:
```

add_header X-Frame-Options SAMEORIGIN;
```

### 設定 IIS

請加入以下指令到網站的 Web.config 檔:
```

<system.webServer>
  ...

  <httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="SAMEORIGIN" />
    </customHeaders>
  </httpProtocol>

  ...
</system.webServer>
```

### 設定 HAProxy

請加入以下指令到 frontend, listen, 或 backend 組態設定檔:
```

rspadd X-Frame-Options:\ SAMEORIGIN
```


**備註：** 設定 Meta tag 是無效的，像是 <meta http-equiv="X-Frame-Options" content="deny"> 便沒有任何效果，只有透過設定 HTTP header 才有效果，請勿採用。

規範
--

| Specification |
| --- |
| HTML Standard # the-x-frame-options-header |

瀏覽器相容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

延伸閱讀
----

* `Content-Security-Policy` (en-US) 的 `frame-ancestors` (en-US) 指令
* HTTP Header Field X-Frame-Options - RFC 7034
* ClickJacking Defenses - IEBlog
* Combating ClickJacking with X-Frame-Options - IEInternals
Strict-Transport-Security
=========================

**HTTP `Strict-Transport-Security`** 回應標頭（簡稱為 HSTS (en-US)）告知瀏覽器應強制使用 HTTPS 以取代 HTTP。

| Header type | Response header (en-US) |
| --- | --- |
| Forbidden header name (en-US) | no |

Syntax
------
```

Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
Strict-Transport-Security: max-age=<expire-time>; preload
```

Directives
----------

`max-age=<expire-time>`

以秒計算的時間，告知瀏覽器應該保持強制 HTTPS 存取的時間有多長。

`includeSubDomains` 選擇性

若該標頭被聲明，則瀏覽器應該將強制使用 HTTPS 的狀態套用至該域名的所有子域。

`preload` 選擇性

參考 Preloading Strict Transport Security。 此非規範的一部份。

Description
-----------

若是網站在被訪問時經由 HTTP 被重定向至 HTTPS，則訪客將在受到 HTTPS 保護前與該網站的非加密版本通信。例如若使用者輸入 `http://www.foo.com/` 或是 foo.com 時，未加密的首次連線為中間人留下了機會。他們可以使用中間人攻擊將使用者定向至惡意網站而非使用者預期的網站的安全版本。

HTTP Strict Transport Security 標頭明確告知瀏覽器在有效期間費不應該使用 HTTP 與該網站進行通訊，並且應該將所有的 HTTP 請求自動轉換成 HTTPS。

**備註：** 瀏覽器將會忽略 HTTP 站點所回應的 `Strict-Transport-Security` 標頭，因為在 HTTP 連線下，該標頭可能是被惡意添加或是竄改的。瀏覽器僅會在使用 HTTPS 連線且該連線由合法的證書保護時回應該標頭的要求，唯有在這種情況下瀏覽器方能確定該站點有正確的 HTTPS 配置且標頭的確由該站點所要求。

### 一個範例情境

你連接到機場提供的免費 WIFI 並且登入你的網路銀行以察看可用餘額並支付帳單，不幸的是，你連上的無線網路實際上是黑客偽造的筆記型電腦。當你嘗試連上網路銀行時，實際上你連結的是黑客所偽造的網路銀行介面，現在，你的帳號密碼已經洩漏了。

HSTS 可以處理這項問題，你只要曾經在安全的環境下連結到你的網路銀行，且該銀行啟用了 HSTS ，那你的瀏覽器將會知道僅使用 HTTPS 進行通訊，而不會接受黑客的重定向請求，HSTS 從中間人手上保護了你的安全。

### 瀏覽器如何處理它

當你首次經由 HTTPS 存取使用 HSTS 的網站時，你的瀏覽器將會記憶此一要求，在未來你存取該網站時將會自動將 HTTP 轉為 HTTPS。

在 HSTS 標頭所指定的時間過期後，瀏覽器將不會自動將 HTTP 轉為 HTTPS。

無論何時將 Strict-Transport-Security 標頭傳遞到瀏覽器，它都會更新該網站的到期時間，因此網站可以更新此一訊息並防止該聲明到期。 如果有必要停用嚴格傳輸安全性，則將 max-age 設置為 0（使用 HTTPS 連接）將立即使 Strict-Transport-Security 標頭過期，從而允許使用 HTTP 訪問。

Preloading Strict Transport Security
------------------------------------

Google maintains an HSTS preload service. By following the guidelines and successfully submitting your domain, browsers will never connect to your domain using an insecure connection. While the service is hosted by Google, all browsers have stated an intent to use (or actually started using) the preload list. However, it is not part of the HSTS specification and should not be treated as official.

* Information regarding the HSTS preload list in Chrome : https://www.chromium.org/hsts
* Consultation of the Firefox HSTS preload list : nsSTSPreloadList.inc
Examples
--------

All present and future subdomains will be HTTPS for a max-age of 1 year. This blocks access to pages or sub domains that can only be served over HTTP.
```

Strict-Transport-Security: max-age=31536000; includeSubDomains
```

Specifications
--------------

| Specification |
| --- |
| HTTP Strict Transport Security (HSTS) # section-6.1 |

Browser compatibility
---------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

See also
--------

* Blog post: HTTP Strict Transport Security has landed!
* Blog post: HTTP Strict Transport Security (force HTTPS)
* OWASP Article: HTTP Strict Transport Security
* Wikipedia: HTTP Strict Transport Security
* Browser test site: HSTS and HPKP test
* Features restricted to secure contexts (en-US)
Authorization
=============

 HTTP 請求中的 **`Authorization`** 是 user agent 用來向伺服器做身份認證（authentication）的憑證（credentials），
 通常是在伺服器回應 `401` (en-US)
`Unauthorized` 狀態及 `WWW-Authenticate` (en-US) 標頭後才會在後續請求使用這個標頭。


| Header type | Request header (en-US) |
| --- | --- |
| Forbidden header name (en-US) | no |

語法
--


```http
Authorization: <type> <credentials>
```

指令
--

<type>

認證方式 (en-US)，通常是 "Basic" (en-US)。其他方式可以參考：

* IANA registry of Authentication schemes
* Authentification for AWS servers (`AWS4-HMAC-SHA256`)

<credentials>

如果使用「Basic」方式，則憑證的格式會長的像這樣：

* 帳號、密碼會用冒號（:）串起來（`aladdin:opensesame`）。
* 然後在以 base64 (en-US) 編碼 (`YWxhZGRpbjpvcGVuc2VzYW1l`)。

**備註：** Base64 編碼不是加密也不是雜湊（Hash）！就算用明文直接傳，安全性也跟用 base64 編碼過一樣（base64 是可以解碼的）。最好用 HTTPS 搭配這種驗證方式。

範例
--
```

Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
```


 可以看看 HTTP authentication (en-US) 中的範例
 教你如何在 Apache 或 nginx 上啟用 HTTP basic authentication 來保護你的網站。

規範
--

| Specification |
| --- |
| HTTP Semantics # field.authorization |

瀏覽器相容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

See also
--------

* HTTP authentication (en-US)
* `WWW-Authenticate` (en-US)
* `Proxy-Authorization` (en-US)
* `Proxy-Authenticate` (en-US)
* `401` (en-US), `403`, `407` (en-US)
Date
====

**`Date`** 標頭的值是傳送當下的日期與時間。

**警告：** `Date` 被列在 fetch spec 的 forbidden header names 清單中 ── 也就是說這段程式不會送出 `Date` 標頭：


```js
fetch("https://httpbin.org/get", {
  headers: {
    Date: new Date().toUTCString(),
  },
});
```


| Header type | General header (en-US) |
| --- | --- |
| Forbidden header name (en-US) | yes |

語法
--


```http
Date: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
```

指令
--

<day-name>

代表星期幾，為 Mon、Tue、Wed、Thu、Fri、Sat 或 Sun 之一（區分大小寫）。

<day>

二位數日期，比如「04」或「23」。

<month>

月份，為 Jan、Feb、Mar、Apr、May、Jun、Jul、Aug、Sep、Oct、Nov、Dec 之一（區分大小寫）。

<year>

四位數年份，比如「1990」或「2016」。

<hour>

二位數小時，比如「09」或「23」。

<minute>

二位數分鐘，比如「04」或「59」。

<second>

二位數秒，比如「04」或「59」。

GMT

格林威治標準時間的意思。在 HTTP 中日期都是採用 GMT，絕不會顯示當地時間。

範例
--
```

Date: Wed, 21 Oct 2015 07:28:00 GMT
```



```js
new Date().toUTCString();
// "Mon, 09 Mar 2020 08:13:24 GMT"
```

規格
--

| Specification |
| --- |
| HTTP Semantics # field.date |

瀏覽器相容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

參閱
--

* `Age`
Accept
======

**`Accept`** HTTP 請求標頭（以 MIME type (en-US) 標示）會對伺服器告知用戶端可解讀的內容類型。伺服器可以透過 content negotiation (en-US) 來選用可行的協定，並以 `Content-Type` 標頭告知用戶端。針對本標頭，瀏覽器可以根據完成請求的脈絡，來決定適合的數值：像是擷取 CSS 時，給予的值就會和圖片、影像、腳本不一樣。

| 標頭類型 | Request header (en-US) |
| --- | --- |
| Forbidden header name (en-US) | no |
| CORS-safelisted request header (en-US) | yes, with the additional restriction that values can't contain a *CORS-unsafe request header byte*: `"():<>?@[\]{}`, Delete, Tab and control characters: 0x00 to 0x19. |

語法
--
```

Accept: <MIME_type>/<MIME_subtype>
Accept: <MIME_type>/*
Accept: */*

// Multiple types, weighted with the quality value (en-US) syntax:
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, */*;q=0.8
```

指令
--

`<MIME_type>/<MIME_subtype>`

一個精確的 MIME type (en-US)，例如`text/html`。

`<MIME_type>/*`

一個不指定子類的 MIME type。`image/*` 會配對到 `image/png`, `image/svg`, `image/gif` 和等圖片類型。

`*/*`

所有 MIME type

`;q=` (q-factor weighting)

Any value used is placed in an order of preference expressed using relative quality value (en-US) called the *weight*.

示例
--
```

Accept: text/html

Accept: image/*

// General default
Accept: */*

// Default for navigation requests
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
```

規範
--

| Specification |
| --- |
| HTTP Semantics # field.accept |

瀏覽器相容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

參見
--

* HTTP content negotiation (en-US)
* Header with the result of the content negotiation: `Content-Type`
* 類似標頭：`TE` (en-US), `Accept-Encoding` (en-US), `Accept-Charset` (en-US), `Accept-Language` (en-US)
Cookie
======

**`Cookie`** 是 HTTP 請求標頭，它的值包含由伺服器設定的 HTTP cookies （透過 `Set-Cookie` (en-US) 標頭設定，或者透過 Javascript 的 `Document.cookie` (en-US) 設定）。

`Cookie` 標頭不是必要的，比如瀏覽器可能會因為隱私設定而直接省略 Cookie 不傳。

| Header type | Request header (en-US) |
| --- | --- |
| Forbidden header name (en-US) | yes |

Syntax
------


```http
Cookie: <cookie-list>
Cookie: name=value
Cookie: name=value; name2=value2; name3=value3
```


<cookie-list>

一連串名值對（name-value pair），格式為： `<cookie-name>=<cookie-value>`。每對之間由一個分號與一個空白分隔（`'; '`）。

範例
--
```

Cookie: PHPSESSID=298zf09hf012fh2; csrftoken=u32t4o3tb3gg43; _gat=1
```

Specifications
--------------

| Specification |
| --- |
| HTTP State Management Mechanism # cookie |

Browser compatibility
---------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

See also
--------

* `Set-Cookie` (en-US)
* `Document.cookie` (en-US)
X-Forwarded-For
===============

**`X-Forwarded-For`**（XFF）標頭是辨識用戶端透過 HTTP 代理或負載平衡 IP 位置來源的，事實上的標準。如果流量是在伺服器與用戶端中間擷取，伺服器日誌就只會代理或負載平衡的 IP 位置。如果要檢查用戶端的 IP 的原始來源，就會去檢查 `X-Forwarded-For` 請求標頭。

這個標頭用於除錯、分析、產生與位置相關的內容、透過設計也洩漏部分隱私資訊，例如用戶端的 IP 位置。因此在部署此標頭時，必須考慮到用戶的隱私。

此 HTTP 標頭的標準化版本為 `Forwarded` (en-US) 標頭。

`X-Forwarded-For` 也是個說明 email-message 是從哪個帳戶轉發的 email-header。

| 標頭屬性 | Request header (en-US) |
| --- | --- |
| Forbidden header name (en-US) | no |

語法
--


```http
X-Forwarded-For: <client>, <proxy1>, <proxy2>
```

指令
--

<client>

用戶端的 IP 位置

<proxy1>, <proxy2>

如果請求用上了多個代理，則列出每個後續代理的 IP 地址。也就是說，最右邊的 IP 位置，是最新代理的 IP 位置；最左邊的 IP 位置，是用戶端原始來源的 IP 位置。

示例
--


```http
X-Forwarded-For: 2001:db8:85a3:8d3:1319:8a2e:370:7348

X-Forwarded-For: 203.0.113.195

X-Forwarded-For: 203.0.113.195, 70.41.3.18, 150.172.238.178
```


其他非標準變體：
```

# Used for some Google services
X-ProxyUser-Ip: 203.0.113.19
```

規範
--

任何版本都沒有被標準化。標準化版本的標頭為 `Forwarded` (en-US)。

參見
--

* `Forwarded` (en-US)
* `X-Forwarded-Host` (en-US)
* `X-Forwarded-Proto` (en-US)
* `Via` (en-US)
Server
======

**`Server`** 標頭描述處理請求的伺服器軟體資訊：也就是產生回應的伺服器資訊。

**警告：** 請避免 Server 值的資訊過度冗長與詳盡，因為它們可能會洩漏實做細節、讓攻擊者容易找到已知安全漏洞並利用之。


| 標頭類型 | Response header (en-US) |
| --- | --- |
| Forbidden header name (en-US) | 否 |

語法
--
```

Server: <product>
```

指令
--

<product>

處理請求的軟體（或組件）名。語法通常與 `User-Agent` 相似。

How much detail to include is an interesting balance to strike; exposing the OS version is probably a bad idea, as mentioned in the earlier warning about overly-detailed values. However, exposed Apache versions helped browsers work around a bug those versions had with `Content-Encoding` (en-US) combined with `Range` (en-US).

示例
--
```

Server: Apache/2.4.1 (Unix)
```

規範
--

| Specification |
| --- |
| HTTP Semantics # field.server |

瀏覽器相容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

參見
--

* `Allow` (en-US)
ETag
====

**`ETag`** 是 HTTP 回應標頭，用來標誌資源的版本。它可以使快取機制更有效率並節省頻寬，
 畢竟資料沒有變動的話，伺服器就不需要再次傳回整份資料。
 而且，它還可以用來預防多人同步更新資料時覆蓋掉彼此的資料（"mid-air collisions"）。

 如果一個網址的資源有更新，就*必須*重新產生它的 `Etag` 值。
 比較前後版本的 ETag 就能知道資源有沒有變化，所以 Etags 的作用就跟指紋一樣。有些伺服器便會把它用在追蹤用途上，而且可能會永久保存這些資訊。


| Header type | Response header (en-US) |
| --- | --- |
| Forbidden header name (en-US) | no |

Syntax
------


```http
ETag: W/"<etag\_value>"
ETag: "<etag\_value>"
```

Directives
----------

`W/` 選擇性

`'W/'` （區分大小寫）表示資源使用 Weak etags (en-US)。
 Weak etags 很容易產生，但較不適合用在版本比對；Strong etags 很難有效率的產生，但很適合用在版本比對。
 同一資源的兩個 weak etags 一致時，可以視為是同個版本，但其內容並非分毫不差。
 比如說 weak etags 可以用在 byte range requests (en-US) 上預防快取，不過帶有 strong etags 的請求仍然可能被快取住。


"<etag\_value>"

 代表資源的版本。它的格式是由雙引號包著的 ASCII 字元組成的，像是： `"675af34563dc-tr34"`。
 產生 `ETag` 值的方式沒有一定。不過通常會是資料的 hash 值、最後修改時間的 hash 值，或者是版本號。
 比如說，MDN 就是使用 wiki 文章的十六進位內文 hash 值。


範例
--
```

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"
```

### 避免空中碰撞

有了 `ETag` 以及 `If-Match` (en-US) 標頭，你可以偵測空中碰撞。

比如說，在進入 wiki 編輯頁時，當下可以把內文的 hash 值放到 HTTP 回應中的 `Etag` 標頭：
```

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
```


 當儲存更新時， `POST` (en-US) 請求就會有一個 `If-Match` (en-US) 標頭，其值為 `ETag`
 的值，這樣便可以用來檢查資料新鮮度。
```

If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
```


 如果 hash 沒有對上，就代表文件已經在你的編輯過程中，被別人先修改了，便會回傳
 `412` (en-US) `Precondition Failed` 錯誤。

### 快取沒更新過的資源

 另一個 `ETag` 標頭的好用處是用來快取沒更新過的資源。如果一位使用者再次造訪一個網址（而且前一次有設定 `ETag`），而資源已經*過期*了（舊到不能用），
 則客戶端會把 `ETag` 的值放在 `If-None-Match` (en-US) 標頭內傳送：
```

If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
```


 伺服器會比對客戶端傳來的 `ETag` （放在 `If-None-Match` 標頭中） 與該資源在伺服器上的現有版本的 `ETag` 值，如果兩者一樣（代表沒更新過），
 伺服器便會傳回 `304` (en-US) `Not Modified` 狀態且不帶資料，
 這就可以讓客戶端知道自己快取住的版本仍然可用（可視為是*新鮮的*）。

規格
--

| Specification |
| --- |
| HTTP Semantics # field.etag |

瀏覽器相容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

See also
--------

* `If-Match` (en-US)
* `If-None-Match` (en-US)
* `304` (en-US) `Not Modified`
* `412` (en-US) `Precondition Failed`
* W3C Note: Editing the Web – Detecting
the Lost Update Problem Using Unreserved Checkout
CONNECT
=======

**HTTP `CONNECT`** 方法會利用請求資源啟動一個雙向通訊。這通常可用於建立隧道。

舉例來說，`CONNECT` 方法可以用於存取使用 SSL (en-US) (HTTPS (en-US)) 的網站。客戶端請求 HTTP Proxy 伺服器建立 TCP 連結的隧道到指定的位置。伺服器接著代表客戶端建立連結。一但連結建立，Proxy 伺服器會持續收送 TCP 流到客戶端。

`CONNECT` 是個逐跳方法。

| 請求具有 Body | 否 |
| --- | --- |
| 成功回覆具有 Body | 是 |
| Safe (en-US) | 否 |
| Idempotent (en-US) | 否 |
| Cacheable | 否 |
| 可用於 HTML 表單 | 否 |

語法
--
```

CONNECT www.example.com:443 HTTP/1.1
```

範例
--

有些 Proxy 伺服器也許需要授權以建立隧道。請見 `Proxy-Authorization` (en-US) 標頭。
```

CONNECT server.example.com:80 HTTP/1.1
Host: server.example.com:80
Proxy-Authorization: basic aGVsbG86d29ybGQ=
```

規格
--

| Specification |
| --- |
| HTTP Semantics # CONNECT |

瀏覽器相容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

參見
--

* Proxy server (en-US)
* `Proxy-Authorization` (en-US)
GET
===

**HTTP `GET` method** 方法請求展示指定資源。 使用 `GET` 的請求只應用於取得資料。

| Request 有 body | No |
| --- | --- |
| 成功的 response 有 body | Yes |
| Safe (en-US) | Yes |
| Idempotent (en-US) | Yes |
| Cacheable | Yes |
| 允許在 HTML 表單 | Yes |

格式
--
```

GET /index.html
```

規範
--

| Specification |
| --- |
| HTTP Semantics # GET |

瀏覽器相容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

參見
--

* `Range` (en-US)
204 No Content
==============

HTTP **`204 No Content`** 成功狀態碼表明請求成功，但客戶端不需要更新目前的頁面。204 回應預設是可被快取的，此類回應中會包含 `ETag` 標頭。

回傳 `204` 的常見情況是作為 `PUT` (en-US) 請求的回應，更新一個資源且沒有更動目前顯示給使用者的頁面內容。若是有資源被建立，`201` `Created` 則應該被回傳。而若頁面應該更新為新的頁面，則應使用 `200` 。

狀態
--
```

204 No Content
```

規範
--

| Specification |
| --- |
| HTTP Semantics # status.204 |

瀏覽器相容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

相容性事項
-----

* 雖然此狀態碼意圖表示不具主體的回應，伺服器仍可能錯誤地在標頭後加入資料。通訊協定允許使用者代理更動此回應的處理方式 (關於規範的討論請參見此處)。這在持久連接中可以被觀察到，無效的主體可能會包含後續請求的不同回應 。
 Apple Safari 拒收這些資料。Google Chrome 及 Microsoft Edge 在有效回應之前丟棄最多四個無效的位元組。Firefox 容許在有效回應之前超過 1KB 的無效資料。
參見
--

* HTTP 請求方法