mod_rewrite:リダイレクト処理

Apache

目次

パラメータ関連

備考:2015年11月5日追記

メンテナンスページへのリダイレクトについては、下の方の302リダイレクトは最適ではないようなので、下記を参考に設定するようにしてください。
理由として302リダイレクトだとリダイレクト先ページは200番のステータスコードが返り、検索順位が落ちる、メンテナンス後に復帰させるのに再度リダイレクトしてあげないといけないなどの問題があるためだそうです。
詳細はこちら↓
http://web-tan.forum.impressrd.jp/e/2009/06/16/5880

メンテナンスページへのリダイレクト

Apacheのconfへの記述の仕方です。.htaccessも下記を参考にしつつ書き換えてください

### Maintenance
Alias /maint /var/www/maint
ErrorDocument 503 /maint/index.html
Header set Retry-After "Fri, 06 Jun 2015 0:00:00 GMT"

RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.99$
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.100$
RewriteCond %{REQUEST_URI} !^/maint/index.html
RewriteRule  ^.*$ /maint/index.html [R=503,L]

フラグの意味

NC大文字小文字を無視
L変換打ち切り(確定)
Rリダイレクト
R=301ドメインの永久移転 ※永久的にリダイレクトさせる場合に使用する。しないとSEOで評価が下がる場合がある
R=302ドメインの一時移転 ※一時的にリダイレクトさせる場合に使用する。しないとSEOで評価が下がる場合がある
NEエスケープしない
OROR条件。記述なしでデフォルトAND条件


同じドメインの別ディレクトリにあるファイルへのリダイレクト

Apacheにて「mod_rewrite」が読み込まれている場合は、Rewriteモジュールにてリダイレクト処理が可能です。
下記記述をhttpd.confに追記してください。

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/user_data/maintenance.php$ [NC]
RewriteCond %{REQUEST_URI} !^/user_data/img/maintenance/header.jpg$ [NC]
RewriteRule  ^.*$ /user_data/maintenance.php [R,L]

※RewriteCondにて、リダイレクト処理を除外しています。
 最後に[NC]を記述することで、次のルールに処理を渡しています。


別ドメインのアドレスへリダイレクト処理を実施する。

httpd.confのDocumentrootの下に以下を追記してください。

<Directory />
    Redirect / http://hogehoge.com
</Directory>

※「/」がDocumentRoot配下を意味しています。

別ドメインのアドレスをリダイレクト処理する(AからBへ)

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.hogehoge\.net [NC]
RewriteRule ^(.*)$ http://www.hogehoge.jp/$1 [R=301,L]

index.phpとindex.htmlのアクセスを統一させる。

例えばトップページで使用していないindex.htmlをindex.phpにリダイレクトさせたい場合、DirectoryIndex?にIndex.phpを追加しておき、Apacheのconfファイルに下記を追記することでトップのindex.phpへ統一させることができます。
別の拡張子も同様です。

### Redirect
RewriteEngine On
RewriteRule ^/index.html$ http://%{HTTP_HOST} [R=301,L]

特定のページのみアクセスを許可する

特定のページのみアクセスを許可する場合で、他ページはリダイレクト処理を実施したい場合は、下記設定にて特定のディレクトリ配下にあるファイルからの処理はすべてリダイレクトを無視する設定をしてください。

RewriteCond %{HTTP_REFERER} !^http://(www\.)?hoge\.com/admin/*.*$ [NC]
RewriteCond %{REQUEST_URI} !^/admin/*.*$ [NC]

上記例では、/admin/配下のページへのアクセスを許可する設定にしています。
/admin以外のページにアクセスした場合は全てリダイレクト処理されます。
しかしながら、/adminの直下にあるindex.phpおよびlogin.phpではリダイレクト対象の画像やjsファイルがパスに含まれていました。
httprefererを使用することで、当該ディレクトリ配下のリダイレクト処理を無視することができます。

トップページへのアクセスのみリダイレクト

RewriteEngine On
RewriteRule ^/$ http://inamuu.com/ [R=301,L]

トップページへのアクセスのみをリダイレクトさせて、その配下のページについては、アクセスさせたい場合は上記記述でOKです。

スマフォサイトへリダイレクトする記述

RewriteEngine On
RewriteCond %{Request_URI} !^/live/mobile/(.*)$ [NC]
RewriteCond %{HTTP_USER_AGENT}  (iPhone|iPod|iPad|Android|BlackBerry|Windows.Phone) [NC]
RewriteRule ^/live/(.*)$ /live/mobile/$1 [R,L]


あるディレクトリへのアクセスの際に、そのディレクトリの配下の別のディレクトリへリダイレクト

hoge配下に複数ファイルがあって、アクセスURLが/hoge/2013という場合。
RewriteCond の!エクスクラメーションマークにて除外している。

RewriteEngine On
RewriteCond %{REQUEST_URI} !/hoge/.+ [NC]
RewriteRule ^/hoge /hoge/2013/ [R=301,L]


スラッシュの有無の統一

RewriteEngine On
RewriteRule ^/hoge/2013$ /hoge/2013/ [R=301,L]

URLの書き換え www有りへの統一

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

URLの書き換え www無しへ統一

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.hogehoge\.com
RewriteRule ^(.*) http://hogehoge.com$1 [R=301,L]

※R=301は301リダイレクトと呼ばれ、永久移転を表す。

特定のディレクトリの配下のみサブドメインを統一する

RewriteEngine On
RewriteCond %{HTTP_HOST} ^inamuu\.com
RewriteCond %{REQUEST_URI} ^/testdir/
RewriteRule ^(.*) http://www.inamuu.com$1 [R=301,L]


Apacheでhttp://*のアクセスを全てhttps://にリダイレクトする方法

# vi /etc/httpd/conf.d/rewrite.conf
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*)?$ https://%{HTTP_HOST}/$1 [L,R]

特定のディレクトリのみhttpsへリダイレクトし、それ以外はhttpでアクセスさせる方法

### httpd.confに記述(80番)80番でhogeにきたらhttpsへリダイレクトする
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{REQUEST_URI} ^/hoge/.*$
RewriteRule /.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

### ssl.confに記述(443番)443番でhoge以外にきたらhttpにリダイレクトする
RewriteEngine On
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{REQUEST_URI} !^/hoge/
RewriteRule /.*$ http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Pound配下の場合

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^/(.*)?$ https://%{HTTP_HOST}/$1 [L,R]
※条件としてPoundからヘッダーにhttpという情報が付与されている必要がある

同一ディレクトリ内の別のディレクトリは除外して、当該ディレクトリへのアクセスはリダイレクトする方法

例えば、http://inamuu.com/test01/ から /top/へリダイレクトしたいけど、 /test01/配下のディレクトリは無視させたい場合は、下記の通りに記述すればOK。

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/test01/(.+)$ [NC]
RewriteRule ^/test01/(.*)$ /top/ [R,L]

「+」をつけることで1文字以上存在すればリダイレクトする。

パラメータ関連

PHPパラメータを持つURLへアクセスがあったらリダイレクト

RewriteEngine On
RewriteCond %{QUERY_STRING} it_id=1393347333
RewriteRule ^/item.php http://inamuu.com/yoyaku/index.php? [R=301,L]


備考 query_stringでパラメータを指定すると、リダイレクト後もパラメータを引き継ぐため、リダイレクト後はパラメータを削除したい場合はリダイレクト後のURLの末尾に「?」を追記することで、パラメータ付きURLへのリクエストをパラメータ無しへのURLへリダイレクト可能

参考URL:http://d.hatena.ne.jp/shimooka/20070328/1175047714

CGIなどのGETパラメータを持っているURLを別のパラメータを持つURLへ書き換え

RewriteEngine On
RewriteCond %{QUERY_STRING} c=list&category_b_pk=1$
RewriteRule ^/cgi-bin/index.cgi products/list.php?category_id=8 [R=301,L]

CGIなどのGETパラメータを持っているURLを同じパラメータのURLへ書き換え

RewriteEngine On
RewriteCond %{QUERY_STRING} c=list&category_b_pk=1$
RewriteRule ^/cgi-bin/index.cgi products/list.php? [R=301,L]

?をURLの末尾に付与すると、元のGETパラメータをそのまま持つ

特定のIPアドレスからのアクセスは除外して、それ以外はリダイレクトする。

RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^192\.168\.0\.1$ 
RewriteCond %{REMOTE_ADDR} !^192\.168\.0\.2$
RewriteRule ^index.html /mainte.html [R=302,L]

外部にはメンテナンス画面を表示させて、社内には通常どおりアクセスさせたい場合に使用可能。


例:メンテナンスで社外からはメンテナンスページを表示させて、社内から通常どおりアクセスさせたい場合

DocumentRootが/var/www/html
メンテナンス用のディレクトリが/var/www/maintenance
メンテナンス用のファイルがindex.htmlとlogo.gifで上記ディレクトリ内にあるとする

下記の記述をApacheのconfファイルに記述する ※数字の所をリダイレクトさせたくない接続元のIPアドレスに変更する
### Maintenance
Alias /maintenance /var/www/html/maintenance

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/maintenance/(.*)$ [NC]
RewriteCond %{REMOTE_ADDR} !123\.456\.789\.101$
RewriteCond %{REMOTE_ADDR} !102\.103\.104\.105$
RewriteRule ^/(.*)$ /maintenance/index.html [R=302,L]

存在しない複数URLに対して

サーバー移行等でURLが代わり、リンク切れをさせないための対策です。下記のように連続して記述可能です。

例1.同じURLへリダイレクトする

RewriteEngine On
RewriteCond ${REQUEST_URI} ^/about [OR]
RewriteCond $REQUEST_URI} ^/news [OR]
RewriteRule ^/(.*)$ http://www.inamuu.com/ [R=301,L]

例2.別のドメインやURLにリダイレクトする

RewriteEngine On
RewriteRule ^/news http://www.inamuu.com/ [R=301,L]
RewriteRule ^/about http://www.inamuu.com/test/ [R=301,L]
RewriteRule ^/locate http://test.inamuu.com/locate/ [R=301,L]

注意事項

VirtualhostやSSLを使用した場合は、それぞれのコンフィグファイルに記述を行う。

参考書籍

Apache実践運用