HTTP リダイレクトの設定

HTTP リダイレクトとは?

まずは HTTP リダイレクトの設定について説明します。

HTTP リダイレクトというのは、クライアントがサーバーに対してある特定の URL へ HTTP 要求を行った場合に、 サーバーがクライアントに対して、異なる URL アクセスするよう指示することをさします。

例えば、HTML ファイルのファイル名を old.html から new.html へ変更して、そのページの URL が http://keicode.com/old.html から http://keicode.com/new.html へ変わったとします。

このときに、古い URL (この場合 http://keicode.com/old.html ) へアクセスを試みたユーザーに対して、 単純に 「ファイルがみつかりません」 という風に返すのではなく、 「新しい URL は http://keicode.com/new.html ですよ」 と教えてあげたら親切です。

このように新しい URL を教えてあげて、ブラウザが処理を中断することなく、 新しい URL から情報を取得できるようにする仕組みが、リダイレクトと呼ばれます。

このとき、Web サーバーはクライアントに対して 300 番台の応答を返します。

HTTP/1.1 でよく使われる主なステータスコードは、301 (Moved Permanently)、 302 (Found)、あるいは 307 (Temporary Redirect) です。それぞれの意味(とひとことメッセージ)は次のとおりです。

ステータスコードリーズンフレーズ意味
301Moved PermanentlyURI は新しい URI へと変更になりました、という意味。どこへ変わったか、という情報は Location ヘッダーに記載される。
301 応答があれば Google の PageRank は新しい URI に対して持ち込まれるそうなので、SEO の観点からも URI が変わったときは、301 を設定するのが良いでしょう。
302FoundURI は一時的に新しい URI へと変更になりました、という意味。どこへ変わったか、という情報は Location ヘッダーに記載されます。 もともと HTTP/1.0 では Temporary Moved でした。
307Temporary RedirectURI は一時的に新しい URI へと変更になりました、という意味。どこへ変わったか、という情報は Location ヘッダーに記載される。HTTP/1.1 から。
ちなみに IIS は HTTP/1.0 として要求を送っても、 307 を返します。

完全なコードについては RFC を参照してください。

IIS の設定

特定の URL のディレクトリを、特定の相対パスあるいは (相対的ではない) URL へリダイレクトしたい場合は、web.config にて httpRedirect を設定します。 ここでは IIS マネージャからの設定を示します。(web.config については最後にちょっと書きます)

IIS マネージャでの設定

IIS マネージャの HTTP リダイレクト から設定します。

が、先にお断りをひとつ。私の IIS は 80 番ポートではなく、 8889 番ポートを使ってますので、 下記の設定例ではポート番号をいちいち指定してます。スクリーンショットを見るときはその辺を適当に読み替えてください。

IIS のリダイレクトの設定

次の画面でリダイレクトする先を指定します。

IIS のリダイレクトの設定

下側の絶対パスで指定する ("Redirect all requests to exact destination (instead of relative to destination)") というチェックを指定しないと、入力した URL は相対パスとして認識されます。

IIS のリダイレクトの設定

例えば、上記をチェックしないで相対パスとして認識した場合は、次のような動作になります。

次のようにルート "/" を要求した場合・・・
指定した ディレクトリを Location ヘッダに指定して応答します。

IIS のリダイレクトの設定

ここまでは何も問題ないですよね。

で、さらにリダイレクトされた先でも、さらにリダイレクトされて /redirect-test1/redirect-test1/ なんてところにリダイレクトされちゃってます。

IIS のリダイレクトの設定

ということで、こういうことを意図しないならば、上記をチェックします。

さらに、サブディレクトリに設定を反映させないためには、以下の "not subdirectories" をチェックします。

IIS のリダイレクトの設定

これをチェックしておけば、サブディレクトリではリダイレクトの設定が有効になりません。
次のように、上ではリダイレクトされていたサブディレクトリに対して HTTP リクエストを投げても、リダイレクトされていないことがわかります。

IIS のリダイレクトの設定

さらに HTTP ステータスコードも、UI からは三種類 301, 302 (デフォルト), 307 が選べます。

上表に書きましたが、URL が完全に変わる場合は 301 を選ぶと SEO 的にも良いです。

以上のように、リダイレクトを IIS マネージャから設定できます。

web.config での設定

上記のように IIS マネージャの UI を用いて リダイレクトを設定すればよいですが、web.config では次のように設定できます。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpRedirect 
            enabled="true" 
            destination="http://localhost:8889/redirect-test1" 
            exactDestination="true" 
            childOnly="true" 
            httpResponseStatus="Permanent" />
    </system.webServer>
</configuration>

exactDestination は絶対パスでの指定の場合 true とし、相対パスのとして destination を解釈する場合は false とします。

子ノードに設定を継承しない場合は、childOnly は true とします。

リダイレクトに 301 を返したいときは、httpResponseStatus を "Permanent" とします。 何も設定しなければ 302 になります。"Temporary" とすると 307 です。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説