2015年02月01日

mod_rewriteでURIを変更せずに静的ページを動的ページにしたり、ホスト名の変更などに対応

最近、mod_rewriteでURIを変更せずに静的ページを動的ページにしたり、ホスト名の変更などにすることがあったので、そのときのメモ

・サーバーやコンテンツを変更せず、あるサイトに新しいドメインを割り当てて、古いドメインでのアクセスを新しいドメインにリダイレクトさせる場合

以下の2つのホスト名が設定されている場合
・www.example.com (今まで使用していた方)
・www.example.net (新しい方)

この場合、mod_rewriteを使い、”.htaccess”に以下のように記述します。
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteRule .* http://www.example.net%{REQUEST_URI} [R=301,L]

%{HTTP_HOST}, %{REQUEST_URI} は、http://www.example.com/test/index.htmlの場合以下のようになります。
%{HTTP_HOST} = www.example.com
%{REQUEST_URI} = /test/index.html

[・・・]の指定は以下のような意味になります。
NC   RewriteCondの判定で大文字、小文字の区別をしません。
R=301 HTTPステータスコード301(Moved Parmanently)でリダイレクト
L   条件にマッチした場合は、[L]の行で実行が停止します。


・ある特定のページを別のページにリダイレクトさせる場合、以下のようにします。
RewriteEngine on
RewriteRule ^/server/test.html$ http://www.example.net/client/test.html [R=301,L]

ただし、バーチャルホストを使用していると、上記でリダイレクトしない場合があります。
原因は条件”^/…$”の先頭にある”/”になります。
この場合は、”^/?…$”にして先頭の”/”が無しでもマッチするようにします。
RewriteEngine on
RewriteRule ^/?server/test.html$ http://www.example.net/client/test.html [R=301,L]

参考
ApacheのRewriteRuleで検索条件に^/がマッチしない場合がある理由


・特定の拡張子のときだけを遷移させる場合、例えば、拡張子が.htmlの静的ページを、URIは変更せずにPHPの動的ページにするような場合
RewriteEngine On
RewriteCond %{REQUEST_URI} \.html$
RewriteRule (.*) /index.php?uri=$1 [L]

ここでは2行目で拡張子".html"のリクエストだけを対象に指定しています。
3行目でリクエストのURIをパラメータとして "/index.php" にアクセスするようにしています。
さらに、最後の[L]にRが無いため、ブラウザに表示されるURIの変更なしに動的ページとなります。

例 http://www.example.com/test/hello.html でアクセスすると、クライアントには分からないように http://www.example.com/index.php?uri=/test/hello.html が実行され、その結果が返されます。

参考
Apache Module mod_rewrite
posted by jun1 at 21:44| Comment(0) | TrackBack(0) | Web
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/113004157

この記事へのトラックバック