Skip to content

Commit

Permalink
2024/10/18 時点の英語版に基づき更新
Browse files Browse the repository at this point in the history
  • Loading branch information
mfuji09 committed Feb 16, 2025
1 parent 8f136e5 commit a67dbf1
Show file tree
Hide file tree
Showing 2 changed files with 170 additions and 19 deletions.
87 changes: 78 additions & 9 deletions files/ja/web/http/status/300/index.md
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")}}
102 changes: 92 additions & 10 deletions files/ja/web/http/status/304/index.md
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")}}

0 comments on commit a67dbf1

Please sign in to comment.