forked from mdn/translated-content
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
170 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,28 +1,97 @@ | ||
--- | ||
title: 300 Multiple Choices | ||
slug: Web/HTTP/Status/300 | ||
l10n: | ||
sourceCommit: bd4d7bc4176d9f67297e3940ae7163a258f07ef5 | ||
--- | ||
|
||
{{HTTPSidebar}} | ||
|
||
HTTP の **`300 Multiple Choices`** リダイレクト状態コードは、リクエストに対して複数のレスポンスがあることを示します。ユーザーエージェントやユーザーは、その内から一つを選択します。レスポンスを一つ選択する方法は標準化されていないため、このレスポンスコードはほとんど使われていません。 | ||
HTTP の **`300 Multiple Choices`** は[リダイレクトレスポンス](/ja/docs/Web/HTTP/Status#リダイレクトメッセージ)ステータスコードで、リクエストに対して複数のレスポンスがあることを示します。 | ||
ユーザーエージェントやユーザーは、その内から一つを選択します。 | ||
|
||
> [!NOTE] | ||
> [エージェント駆動型コンテンツネゴシエーション](/ja/docs/Web/HTTP/Content_negotiation#エージェント駆動型ネゴシエーション)では、サーバーに複数の候補が存在する場合、クライアントとサーバーが共同で指定されたリソースの最適な候補を決定します。 | ||
> ほとんどのクライアントは、レスポンスから自動的に選択する手段を持っていません。また、追加の往復通信により、クライアントとサーバーの対話が遅くなります。 | ||
> [サーバー駆動型コンテンツネゴシエーション](/ja/docs/Web/HTTP/Content_negotiation#サーバー駆動型コンテンツネゴシエーション)の方がはるかに広く使用されており、サーバーはリクエストヘッダー({{HTTPHeader("Accept-Language")}}、{{HTTPHeader("Accept")}} など)に基づいて、クライアントに最も適したリソースを選べます。 | ||
サーバーは、ユーザーまたはユーザーエージェントが選択できるリソースメタデータと URI のリストを含むコンテンツをレスポンスに含めるべきです。コンテンツの形式は実装に依存しますが、ユーザーエージェントによって簡単に解析できる形式(HTML や JSON など)であるべきです。 | ||
|
||
サーバーが推奨する選択肢がある場合は、 {{HTTPHeader("Location")}} ヘッダーを生成してください。 | ||
|
||
## 状態 | ||
## ステータス | ||
|
||
``` | ||
```http | ||
300 Multiple Choices | ||
``` | ||
|
||
## 例 | ||
|
||
### リソースのリストがついた 300 レスポンス | ||
|
||
次の例は、透過的コンテンツネゴシエーションのリクエストとレスポンスのやり取りを示しています。 | ||
Apache サーバーは、[型マップ](https://httpd.apache.org/docs/trunk/mod/mod_negotiation.html#typemaps)で定義されたリソースの複数の版を、入力する言語に応じて、英語のコンテンツには `index.html.en`、フランス語のコンテンツには `index.html.fr` というように提供します。 | ||
|
||
```plain | ||
URI: index.html.en | ||
Content-Language: en | ||
URI: index.html.fr | ||
Content-Language: fr | ||
``` | ||
|
||
`Negotiate: trans` リクエストヘッダーは、クライアントが TCN を使用してリソースを選べます。 | ||
このメカニズムに対応するブラウザーが少ないということは、代わりに curl などのユーザーエージェントが使用されているということになります。 | ||
|
||
```bash | ||
curl -v -H "Negotiate: trans" http://localhost/index | ||
``` | ||
|
||
これは、次のリクエストを生成します。 | ||
|
||
```http | ||
GET /index HTTP/1.1 | ||
Host: localhost | ||
User-Agent: curl/8.7.1 | ||
Accept: */* | ||
Negotiate: trans | ||
``` | ||
|
||
リクエストされたリソースのさまざまな表現の詳細とともに、 `300` のレスポンスを受け取ります。 | ||
|
||
```http | ||
HTTP/1.1 300 Multiple Choices | ||
Date: Fri, 30 Aug 2024 09:21:48 GMT | ||
Server: Apache/2.4.59 (Unix) | ||
Alternates: {"index.html.en" 1 {type text/html} {language en} {length 48}}, {"index.html.fr" 1 {type text/html} {language fr} {length 45}} | ||
Vary: negotiate,accept-language | ||
TCN: list | ||
Content-Length: 419 | ||
Content-Type: text/html; charset=iso-8859-1 | ||
<html><head> | ||
<title>300 Multiple Choices</title> | ||
</head><body> | ||
<h1>Multiple Choices</h1> | ||
Available variants: | ||
<ul> | ||
<li><a href="index.html.en">index.html.en</a> , type text/html, language en</li> | ||
<li><a href="index.html.fr">index.html.fr</a> , type text/html, language fr</li> | ||
</ul> | ||
</body></html> | ||
``` | ||
|
||
## 仕様書 | ||
|
||
| 仕様書 | 題名 | | ||
| ------------------------------------------------- | ------------------------------------------------------------- | | ||
| {{RFC("7231", "300 Multiple Choices" , "6.4.1")}} | Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content | | ||
{{Specifications}} | ||
|
||
## 関連情報 | ||
|
||
- {{HTTPStatus("301")}} `Moved Permanently` | ||
- {{HTTPStatus("302")}} `Found` (一時リダイレクト) | ||
- {{HTTPStatus("308")}} `Permanent Redirect` | ||
- [HTTP リクエストメソッド](/ja/docs/Web/HTTP/Methods) | ||
- [HTTP レスポンスステータスコード](/ja/docs/Web/HTTP/Status) | ||
- {{HTTPStatus("301", "301 Moved Permanently")}} | ||
- {{HTTPStatus("302", "302 Found")}} 一時リダイレクト | ||
- {{HTTPStatus("308", "308 Permanent Redirect")}} | ||
- {{HTTPStatus("506", "506 Variant Also Negotiates")}} | ||
- [Apache Server Negotiation Algorithm](https://httpd.apache.org/docs/current/en/content-negotiation.html#algorithm) | ||
- {{RFC("2295", "Transparent Content Negotiation in HTTP")}} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,38 +1,120 @@ | ||
--- | ||
title: 304 Not Modified | ||
slug: Web/HTTP/Status/304 | ||
l10n: | ||
sourceCommit: ae86913908651e6008079242691e06b5e01d1c78 | ||
--- | ||
|
||
{{HTTPSidebar}} | ||
|
||
HTTP **`304 Not Modified`** クライアントリダイレクトレスポンスコードは、リクエストされたリソースを再送する必要がないことを示します。これはキャッシュされたリソースへの暗黙のリダイレクトです。これは、{{HTTPMethod("GET")}} や {{HTTPMethod("HEAD")}} リクエストのようなリクエストメソッドが {{glossary("safe")}} である場合、またはリクエストが条件付きで {{HTTPHeader("If-None-Match")}} もしくは {{HTTPHeader("If-Modified-Since")}} ヘッダーを使用しているときに発生します。 | ||
HTTP **`304 Not Modified`** [リダイレクトレスポンス](/ja/docs/Web/HTTP/Status#リダイレクトメッセージ)ステータスコードは、リクエストされたリソースを再送する必要がないことを示します。 | ||
|
||
{{HTTPStatus("200")}} `OK` と同等のレスポンスは {{HTTPHeader("Cache-Control")}}、{{HTTPHeader("Content-Location")}}、{{HTTPHeader("Date")}}、{{HTTPHeader("ETag")}}、{{HTTPHeader("Expires")}} および {{HTTPHeader("Vary")}} ヘッダーを含みます。 | ||
このレスポンスコードは、リクエストが[条件付き](/ja/docs/Web/HTTP/Conditional_requests)の {{HTTPMethod("GET")}} や {{HTTPMethod("HEAD")}} リクエストに {{HTTPHeader("If-None-Match")}} もしくは {{HTTPHeader("If-Modified-Since")}} ヘッダーが付いており、条件が 'false' と評価された時に送信されます。 | ||
これは、クライアントがキャッシュしたリソースがまだ有効であり、条件が 'true' と評価された場合、サーバーはリソースとともに {{HTTPStatus("200", "200 OK")}} レスポンスを送信したであろうことを確認します。 | ||
詳細については、 [HTTP キャッシュ](/ja/docs/Web/HTTP/Caching)を参照してください。 | ||
|
||
レスポンスには本体を含んではならず、 {{HTTPStatus("200")}} レスポンスで送信されるであろう次のようなヘッダーを記載しなければなりません。 | ||
|
||
- {{HTTPHeader("Cache-Control")}} | ||
- {{HTTPHeader("Content-Location")}} | ||
- {{HTTPHeader("Date")}} | ||
- {{HTTPHeader("ETag")}} | ||
- {{HTTPHeader("Expires")}} | ||
- {{HTTPHeader("Vary")}} | ||
|
||
> [!NOTE] | ||
> 多くのブラウザーの[開発ツールのネットワークパネル](https://firefox-source-docs.mozilla.org/devtools-user/network_monitor/index.html)は `304` レスポンスにつながる追加のリクエストを作成するため、開発者はローカルキャッシュへのアクセスを見ることができます。 | ||
## ステータス | ||
|
||
``` | ||
```http | ||
304 Not Modified | ||
``` | ||
|
||
## 仕様 | ||
## 例 | ||
|
||
### 条件付きリクエストに対する 304 レスポンス | ||
|
||
下記の例は、条件付きリクエストヘッダーつきの [curl](https://curl.se/) を使用して作成された {{HTTPMethod("GET")}} リクエストを示しています。 | ||
`--http1.1` フラグは、読みやすくするために HTTP/1.1 プロトコルを強制するために使用されています。 | ||
|
||
最初のリクエストは、`If-Modified-Since` 条件を使用して未来の日付である 2050 年 11 月 21 日を設定しています。 | ||
これは `false` と評価されるはずです。まだ現れていない時点以降にリソースが更新されることはありえないからです。 | ||
|
||
```bash | ||
curl --http1.1 -I --header 'If-Modified-Since: Tue, 21 Nov 2050 08:00:00 GMT' \ | ||
https://developer.mozilla.org/en-US/ | ||
``` | ||
|
||
これにより、次のような HTTP リクエストが発生します。 | ||
|
||
```http | ||
GET /en-US/ HTTP/1.1 | ||
Host: developer.mozilla.org | ||
User-Agent: curl/8.7.1 | ||
Accept: */* | ||
If-Modified-Since: Tue, 21 Nov 2050 08:00:00 GMT | ||
``` | ||
|
||
リソースが {{HTTPHeader("If-Modified-Since")}} ヘッダーのタイムスタンプ後に更新された場合、現在のリソースバージョンではレスポンスは {{HTTPStatus("200", "200 OK")}} となりるはずです。 | ||
代わりに `304` レスポンスを取得し、そのレスポンスには {{HTTPHeader("ETag")}}、{{HTTPHeader("Age")}}、{{HTTPHeader("Expires")}} の各ヘッダーが含まれ、リソースのキャッシュされたバージョンが最新であることを示します。 | ||
|
||
```http | ||
HTTP/1.1 304 Not Modified | ||
Date: Wed, 28 Aug 2024 09:52:35 GMT | ||
Expires: Wed, 28 Aug 2024 10:01:53 GMT | ||
Age: 3279 | ||
ETag: "b20a0973b226eeea30362acb81f9e0b3" | ||
Cache-Control: public, max-age=3600 | ||
Vary: Accept-Encoding | ||
X-cache: hit | ||
Alt-Svc: clear | ||
``` | ||
|
||
それでは、別の `curl` コマンドを実行し、前回レスポンスで取得した `etag` 値を {{HTTPHeader("If-None-Match")}} 条件とともに使用します(この `etag` はサーバー上のリソースの最新バージョンであるため、 `304 Not Modified` レスポンスが返されると予想されます)。 | ||
|
||
```bash | ||
curl --http1.1 -I --header 'If-None-Match: "b20a0973b226eeea30362acb81f9e0b3"' \ | ||
https://developer.mozilla.org/en-US/ | ||
``` | ||
|
||
| 仕様書 | タイトル | | ||
| ------------------------------------------- | ------------------------------------------------------------ | | ||
| {{RFC("7232", "304 Not Modified" , "4.1")}} | Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests | | ||
これにより、次のような HTTP リクエストが発生します。 | ||
|
||
```http | ||
GET /en-US/ HTTP/1.1 | ||
Host: developer.mozilla.org | ||
User-Agent: curl/8.7.1 | ||
Accept: */* | ||
If-None-Match: "b20a0973b226eeea30362acb81f9e0b3" | ||
``` | ||
|
||
リクエスト時点では `etag` の値が一致するため、エンティティタグは条件に合わず、`304` レスポンスが返されます。 | ||
|
||
```http | ||
HTTP/1.1 304 Not Modified | ||
Date: Wed, 28 Aug 2024 10:36:35 GMT | ||
Expires: Wed, 28 Aug 2024 11:02:17 GMT | ||
Age: 662 | ||
ETag: "b20a0973b226eeea30362acb81f9e0b3" | ||
Cache-Control: public, max-age=3600 | ||
Vary: Accept-Encoding | ||
X-cache: hit | ||
Alt-Svc: clear | ||
``` | ||
|
||
## ブラウザーの互換性 | ||
## 仕様書 | ||
|
||
{{Compat}} | ||
{{Specifications}} | ||
|
||
## 互換性メモ | ||
|
||
- このレスポンスが永続的な接続上で誤って本文を含むと、ブラウザーの動作が異なります。詳細については [204 No Content](/ja/docs/Web/HTTP/Status/204) を参照してください。 | ||
このレスポンスが永続的な接続上で誤って本文を含んだ場合、ブラウザーの動作はさまざまです。 | ||
詳しくは {{HTTPStatus("204", "204 No Content")}} を参照してください。 | ||
|
||
## 関連情報 | ||
|
||
- [HTTP のリダイレクト](/ja/docs/Web/HTTP/Redirections) | ||
- [HTTP レスポンスステータスコード](/ja/docs/Web/HTTP/Status) | ||
- [HTTP 条件付きリクエスト](/ja/docs/Web/HTTP/Conditional_requests) | ||
- {{HTTPHeader("If-Modified-Since")}} | ||
- {{HTTPHeader("If-None-Match")}} |