diff --git a/files/ja/web/http/status/300/index.md b/files/ja/web/http/status/300/index.md index f1ef857be36451..5200de0ec838e7 100644 --- a/files/ja/web/http/status/300/index.md +++ b/files/ja/web/http/status/300/index.md @@ -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 + + +300 Multiple Choices + +

Multiple Choices

+Available variants: + + +``` + ## 仕様書 -| 仕様書 | 題名 | -| ------------------------------------------------- | ------------------------------------------------------------- | -| {{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")}} diff --git a/files/ja/web/http/status/304/index.md b/files/ja/web/http/status/304/index.md index 326178ddd02c6a..ff937130136eee 100644 --- a/files/ja/web/http/status/304/index.md +++ b/files/ja/web/http/status/304/index.md @@ -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")}}