Skip to content

Commit

Permalink
2023/04/11 時点の英語版に同期
Browse files Browse the repository at this point in the history
  • Loading branch information
mfuji09 committed Oct 5, 2023
1 parent c4e9817 commit bac39dc
Showing 1 changed file with 26 additions and 24 deletions.
50 changes: 26 additions & 24 deletions files/ja/web/http/redirections/index.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
---
title: HTTP のリダイレクト
slug: Web/HTTP/Redirections
l10n:
sourceCommit: 0880a90f3811475d78bc4b2c344eb4146f25f66c
---

{{HTTPSidebar}}

*URL リダイレクト*は、 *URL 転送*とも呼ばれ、ページ、フォーム、ウェブアプリケーション全体などに二つ以上の URL のアドレスを与える技術です。 HTTP ではこの操作のために、特別な種類のレスポンスである **_HTTP リダイレクト_**を提供しています。
**URL リダイレクト**は、 *URL 転送*とも呼ばれ、ページ、フォーム、ウェブサイト全体、ウェブアプリケーションなどに 2 つ以上の URL のアドレスを与える技術です。 HTTP ではこの操作のために、特別な種類のレスポンスである **_HTTP リダイレクト_**を提供しています。

リダイレクトには多くの目的があります。

Expand All @@ -18,21 +20,21 @@ HTTP では、リダイレクトはリクエストに対して、サーバーが

ブラウザーがリダイレクトを受け取ると、 `Location` ヘッダーで提供された新たな URL を使用して直ちに読み込みを行います。追加の往復によるパフォーマンスの低下の他に、ユーザーがリダイレクトに気づくことはほとんどありません。

![](httpredirect.png)
![最初のリクエストはクライアントからサーバーに送られます。サーバーはリダイレクト先のURLとともに 301:moved permanently で応答します。クライアントは新しい URL への GET リクエストを行い、サーバーは 200 OK レスポンスでこれを返します。](httpredirect.png)

リダイレクトには何種類かがありますが、3 つのカテゴリに分類することができます
リダイレクトには何種類かがありますが、3 つのカテゴリーに分類することができます

1. [恒久的リダイレクト](#Permanent_redirections)
2. [一時的リダイレクト](#Temporary_redirections)
3. [特殊リダイレクト](#Special_redirections)
1. [恒久的リダイレクト](#恒久的リダイレクト)
2. [一時的リダイレクト](#一時的リダイレクト)
3. [特殊リダイレクト](#特殊リダイレクト)

### 恒久的リダイレクト

これらのリダイレクトは永遠に続くことを意味します。これらのリダイレクトは、元の URL はもう使用されず、新しいものに置き換えるべきであることを示しています。検索エンジンのロボット、 RSS リーダー、および他のクローラーは、リソースの元の URL を更新します。

| コード | テキスト | メソッドの扱い | 主な使用例 |
| ------ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ |
| `301` | `Moved Permanently` | {{HTTPMethod("GET")}} メソッドは変更しません。 他のメソッドは {{HTTPMethod("GET")}} に変更されるかもしれません。[\[1\]](#attr1) | ウェブサイトの再編。 |
| `301` | `Moved Permanently` | {{HTTPMethod("GET")}} メソッドは変更しません。 他のメソッドは {{HTTPMethod("GET")}} に変更されるかもしれません。[1] | ウェブサイトの再編。 |
| `308` | `Permanent Redirect` | メソッドや本文は変更しません。 | GET 以外のリンクや操作を含むウェブサイトの再編。 |

\[1] 仕様書ではメソッドの変更を意図していませんが、メソッドを変更するユーザーエージェントが存在します。 {{HTTPStatus("308")}} が定義されたのは、 `GET` 以外のメソッドを使用するときの動作のあいまいさをなくすためです。
Expand All @@ -45,15 +47,15 @@ HTTP では、リダイレクトはリクエストに対して、サーバーが

| コード | テキスト | メソッドの扱い | 主な使用例 |
| ------ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `302` | `Found` | {{HTTPMethod("GET")}} メソッドは変更しません。 他のメソッドは {{HTTPMethod("GET")}} に変更されるかもしれません。[\[2\]](#attr2) | ウェブページは不測の理由により、一時的に利用できない状態です。 |
| `302` | `Found` | {{HTTPMethod("GET")}} メソッドは変更しません。 他のメソッドは {{HTTPMethod("GET")}} に変更されるかもしれません。[2] | ウェブページは不測の理由により、一時的に利用できない状態です。 |
| `303` | `See Other` | {{HTTPMethod("GET")}} メソッドは変更しません。 他のメソッドは `GET`*変更します* (本文は失われます)。 | ページの再読み込みによって操作が再度実施されることを防ぐために、{{HTTPMethod("PUT")}} や {{HTTPMethod("POST")}} の後のリダイレクトで使用します。 |
| `307` | `Temporary Redirect` | メソッドと本文は変更しません。 | ウェブページは不測の理由により、一時的に使用できない状態です。検索エンジンは自身のリンクを更新しません。 `302` と比較して、サイトで `GET` 以外の操作を使用できる場合に推奨されます。 |

\[2] 仕様書ではメソッドの変更を意図していませんが、実際はメソッドを変更するユーザーエージェントが存在します。`GET` 以外のメソッドを使用するときの動作のあいまいさをなくすために、 {{HTTPStatus("307")}} が定義されました。

### 特殊リダイレクト

{{HTTPStatus("304")}} (Not Modified) は、ページをローカルにキャッシュした (陳腐化した) 複製へリダイレクトします。また {{HTTPStatus("300")}} (Multiple Choice) は、手動リダイレクトです。ブラウザーがウェブページとして表示する本文には使用可能なリダイレクトのリストがあり、ユーザーはひとつ選択してクリックします。
{{HTTPStatus("304")}} (Not Modified) は、ページをローカルにキャッシュした陳腐化した複製へリダイレクトします。また {{HTTPStatus("300")}} (Multiple Choice) は、手動リダイレクトです。ブラウザーがウェブページとして表示する本文には使用可能なリダイレクトのリストがあり、ユーザーはひとつ選択してクリックします。

| コード | テキスト | 主な使用例 |
| ------ | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
Expand All @@ -62,14 +64,14 @@ HTTP では、リダイレクトはリクエストに対して、サーバーが

## リダイレクトを指定する代替手段

HTTP リダイレクトは、リダイレクトを定義する唯一の手段ではありません。他にも二つの方法があります
HTTP リダイレクトは、リダイレクトを定義する唯一の手段ではありません。他にも 2 つの方法があります

1. {{HTMLElement("meta")}} 要素を使用する HTML リダイレクト
2. [DOM](/ja/docs/Web/API/Document_Object_Model) による JavaScript リダイレクト

### HTML リダイレクト

HTTP リダイレクトはリダイレクトを作成するための最良の方法ですが、サーバーの制御権を持っていない場合もあります。このような場合は、そのページの {{HTMLElement("head")}} 内に [`http-equiv`](/ja/docs/Web/HTML/Element/meta#http-equiv) 属性に `Refresh` を設定した {{HTMLElement("meta")}} 要素を記述してみてください。ページを表示すると、ブラウザーは示されたページへ移動します。
HTTP リダイレクトはリダイレクトを作成するための最良の方法ですが、サーバーの制御権を持っていない場合もあります。このような場合は、そのページの {{HTMLElement("head")}} 内に {{HTMLElement("meta")}} 要素を記述し、その [`http-equiv`](/ja/docs/Web/HTML/Element/meta#http-equiv) 属性に `Refresh` を設定してみてください。ページを表示すると、ブラウザーは示されたページへ移動します。

```html
<head>
Expand Down Expand Up @@ -113,7 +115,7 @@ HTML リダイレクトと同様にすべてのリソースでは動作できず
- : よくある事例は、サイトが `www.example.com` ドメイン配下に存在しているとき、`example.com` からもアクセスできるようにしたい場合です。この場合は、`example.com` から `www.example.com` へのリダイレクトを設定します。また、一般的に使用される同義語や、ドメイン名の打ち間違いで頻度が多いものを提供してもよいでしょう。
- 別のドメインに移動するため
- : 例えば、会社名が変わっても、既存のリンクやブックマークからも新しい会社名を見つけられるようにしたいでしょう。
- [HTTPS](/ja/docs/Glossary/https) を強制するため
- [HTTPS](/ja/docs/Glossary/HTTPS) を強制するため
- : `http://` 版のサイトへのリクエストを `https://` 版のサイトにリダイレクトします。

### リンクの存続
Expand All @@ -122,7 +124,7 @@ HTML リダイレクトと同様にすべてのリソースでは動作できず

外部のリンクは貴重なユーザーを連れてきてくれるし、 SEO にも役立つため、リンクを壊したくはありません。よって、古い URL から新しい URL へのリダイレクトを設定します。

> **メモ:** この手法は内部のリンクにも有効ですが、内部のリダイレクトは避けるようにしてください。リダイレクトは (追加の HTTP リクエストを行うため) 性能の負担がかなりあります。内部のリンクを修正することでこれを避けられるのであれば、リンクを修正してください。
> **メモ:** この手法は内部のリンクにも有効ですが、内部のリダイレクトは避けるようにしてください。リダイレクトは追加の HTTP リクエストを行うため性能の負担がかなりあります。内部のリンクを修正することでこれを避けられるのであれば、リンクを修正してください。
### 安全でないリクエストへの一時的なレスポンス

Expand All @@ -134,17 +136,17 @@ HTML リダイレクトと同様にすべてのリソースでは動作できず

### 長いリクエストに対する一時的なレスポンス

{{HTTPHeader("DELETE")}} リクエストを後で処理するように予定するなど、リクエストによってはサーバー側で長い時間が必要になる場合があります。この場合、レスポンスを {{HTTPStatus("303")}} (See Other) として操作が実行予定に追加されたことを示すページにリンクし、最終的に進捗を確認したり、キャンセルできるようにしたりするようにします。
{{HTTPMethod("DELETE")}} リクエストを後で処理するように予定するなど、リクエストによってはサーバー側で長い時間が必要になる場合があります。この場合、レスポンスを {{HTTPStatus("303")}} (See Other) として操作が実行予定に追加されたことを示すページにリンクし、最終的に進捗を確認したり、キャンセルできるようにしたりするようにします。

## 一般的なサーバーにおけるリダイレクトの設定

### Apache

リダイレクトはサーバーの設定ファイルか、各ディレクトリの `.htaccess` で設定できます。

[`mod_alias`](https://httpd.apache.org/docs/current/mod/mod_alias.html) モジュールに、 (既定で) {{HTTPStatus("302")}} レスポンスを設定するための `Redirect` および `RedirectMatch` ディレクティブがあります
[`mod_alias`](https://httpd.apache.org/docs/current/mod/mod_alias.html) モジュールには `Redirect` および `RedirectMatch` ディレクティブがあり、これらは既定で {{HTTPStatus("302")}} レスポンスを設定します

```
```xml
<VirtualHost *:443>
ServerName example.com
Redirect / https://www.example.com
Expand All @@ -155,27 +157,27 @@ URL `https://example.com/` は `https://www.example.com/` にリダイレクト

`RedirectMatch` も同じですが、対象の URL の集合を定義するために{{glossary("regular expression", "正規表現")}}を使用します。

```
```plain
RedirectMatch ^/images/(.*)$ https://images.example.com/$1
```

`images/` フォルダー内のすべての文書が、別のドメインにリダイレクトされます。

一時的なリダイレクトを設定したくない場合は、別の種類のリダイレクトを設定するために追加引数 (使用する HTTP ステータスコードまたは `permanent` キーワード) を使用できます。

```
```plain
Redirect permanent / https://www.example.com
# …acts the same as:
Redirect 301 / https://www.example.com
```

[`mod_rewrite`](http://httpd.apache.org/docs/current/mod/mod_rewrite.html) モジュールでリダイレクトを作成することもできます。こちらはさらに柔軟性がありますが、若干複雑です。
[`mod_rewrite`](https://httpd.apache.org/docs/current/mod/mod_rewrite.html) モジュールでリダイレクトを作成することもできます。こちらはさらに柔軟性がありますが、若干複雑です。

### Nginx

Nginx では、リダイレクトしたいコンテンツ用の server ブロックを作成します。

```
```plain
server {
listen 80;
server_name example.com;
Expand All @@ -185,14 +187,14 @@ server {

ディレクトリまたは特定のページにのみリダイレクトを適用するには、`rewrite` ディレクティブを使用します。

```
```plain
rewrite ^/images/(.*)$ https://images.example.com/$1 redirect;
rewrite ^/images/(.*)$ https://images.example.com/$1 permanent;
```

### IIS

IIS では、[`<httpRedirect>`](https://www.iis.net/configreference/system.webserver/httpredirect) 要素を使用してリダイレクトを設定します。
IIS では、[`<httpRedirect>`](https://docs.microsoft.com/iis/configuration/system.webServer/httpRedirect/) 要素を使用してリダイレクトを設定します。

## リダイレクトループ

Expand All @@ -202,12 +204,12 @@ IIS では、[`<httpRedirect>`](https://www.iis.net/configreference/system.webse

時々、サーバーがリダイレクトループを検出しないことがあります。それぞれのサーバーでは全貌を把握できない、複数のサーバーにわたるリダイレクトループがあり得ます。この場合はブラウザーがループを検出して、エラーメッセージを表示するでしょう。Firefox では以下のメッセージを表示します。

> このアドレスへのリクエストに対するサーバーの自動転送設定がループしています
> Firefox は、サーバーがこのアドレスへのリクエストを決して終了しない方法でリダイレクトしていることを検出しました
Chrome では以下のように表示されます。

> このウェブページにはリダイレクト ループが含まれています
どちらの場合も、ユーザーができることはほとんどありません (キャッシュや Cookie の不一致など、ユーザー側で問題が発生している場合を除きます)。

リダイレクトループはユーザー体験を完全に損ないますので、避けることが重要です。
リダイレクトループは使い勝手をを完全に損ないますので、避けることが重要です。

0 comments on commit bac39dc

Please sign in to comment.