にしし ふぁくとりー(西村文宏 個人サイト)

Presented by Nishishi via Movable Type. Last Updated: 2015/09/22. 13:22:21.

mod_rewriteでリダイレクトさせた場合のHTTPステータスコード

WebサーバがApacheの場合、「.htaccess」ファイルにRedirectディレクティブを使ってリダイレクト先URLを記述することで、任意の場所へリダイレクトさせることができます。
その際、Redirectディレクティブのオプションとして、「permanent」とか「temp」とか記述することで、リダイレクト時のHTTPステータスコードを指定できます。

リダイレクトさせるときのHTTPステータスコードは、301か302です。
301は「Moved Permanently」で永続的な移転を示すステータスコードで、302は「Moved Temporarily」(HTTP1.1ではFound)で一時的な移転を示すステータスコードです。
ちなみに、以下のよーに書きます。

Redirect permanent /sakura/ http://www.example.com/sakura/
Redirect temp /tomoyo/ http://www.example.net/tomoyo/

上記の場合、sakuraディレクトリは301で、tomoyoディレクトリは302でリダイレクトします。
このように、Redirectディレクティブを使う限り、このHTTPステータスコードは望みのままに指定可能です。

さて、本題はここからです。(^_^;)

Redirectではなく、mod_rewriteを使ってリダイレクトさせた場合は、どんなHTTPステータスコードが返されているのか?

リダイレクトさせたいんなら、そのものすばりなRedirectディレクティブを使えばいいわけですけど、mod_rewriteを使っても同じ動作が実現可能です。
たとえば、以下のよーな感じで。

RewriteEngine on
RewriteRule ^sakura.html$ http://www.example.org/sakura.html [L]

上記のようにリライトルールを記述すれば、sakura.htmlファイルへのアクセスを指定のURLに飛ばすことができます。mod_rewriteは、実際には存在しないURLに仮想的な実体を与えるのに使う記述ですから、こんなリダイレクト用途に使うのは、本来の用途から外れているのかもしれませんが…。(^_^;) でもこう書けることは書けますよね。

で、このとき、果たしてどんなHTTPステータスコードが返されてリダイレクトされるのかな…?とちょいと疑問に思ったんです。

というわけで、HTTPレスポンスヘッダ確認ツールで調べてみました。
私のサーバ( www.nishishi.com )では、mod_rewriteを使ったリダイレクトでは、以下のようなHTTPレスポンスヘッダが返されるようです。

HTTP/1.1 302 Found
Date: Mon, 16 Apr 2007 14:53:11 GMT
Server: Apache/1.3.37 (Unix)
Location: http://www.example.org/sakura.html
Content-Type: text/html; charset=iso-8859-1

どうやら、HTTPステータスコードは、302(一時的な移転)が返されるようです。
301(永続的な移転)ではないのですね。
この結果が、どんな環境でも一緒なのかどうかは分かりませんが…。

ちなみに、本来の用途…というか、外部サイトへ飛ばすのではなく、自サイト内に仮想的なURLを作る用途でmod_rewriteを使った場合は、200が返されます。(そりゃそうだよな。^^;)

上記のレスポンスヘッダで、「302 Moved Temporarily」ではなく「302 Found」となっているのは、HTTP1.1だからですね。(まあHTTPの仕様的には、コードより後の文字列には何を出力しても構わないらしいですが。^^; 「302 MoeMoe」とかでも問題ないらしい。^^;;;)

HTTP1.1には「307 Temporary Redirect」というのがあって、これがまさに「一時的な移転」を示すんですけど、これを返さないのは、HTTP1.1で通信できないクライアントのためかな?

……ちょっと脱線。

まあつまり、mod_rewriteで外部サイトへ飛ばすよう記述すると、どうやら「302」でリダイレクトされるらしい、という結果でした。

Apacheのリファレンスによると、Redirectディレクティブを使ってステータスコードを省略した場合も、302が返されるようです。リダイレクト処理においては、302(一時的な移転)とするのがデフォルトの動作なんですかねー?

コメント

コメント数: 0件

コメント投稿欄 この日記に対するコメント投稿を歓迎します。

保存しますか?



※本文中にURLは書けません。(書くと投稿が拒否されますのでご注意下さい。)

※投稿内容は、実際にページ上に掲載される前に、管理者によって確認される設定にしている場合があります。その場合は、投稿後にその旨が表示されます。たいてい1~2日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

トラックバック

このエントリーへのトラックバックURLを表示するにはここをクリック
※スパム防止のため、トラックバックURLは別ウインドウで表示します。(JavaScriptが有効でないと表示されません。)

--- 当サイト内を検索 ---