URLのRewrite設定例
ApacheのRewrite設定例。
リクエストのあったURLの内部書き換えについて、いくつかサンプルをまとめています。
目次
- 環境・条件
- URLの変換
- ドメインではなくIPアドレスによるアクセスの拒否
- トップドメインのアクセス拒否
- ユーザーエージェントの文字列が空または特定URLのアクセス拒否
- メンテナンス実施時の一時的なアクセスの拒否
- 旧サイトにアクセスされた場合などのリダイレクト
- 参考リンク
環境・条件
「/var/www/html」配下の「.htaccess」ファイルに設定を追加。
ドメインは「http://sample.xyz」と仮定。
サンプル環境の構成は以下の通りとします。
/var/www/html/ └ sample/ └ index.html └ maintenance.html └ article/ └ article/ └ 123.html
URLの変換
「http://sample.xyz」のリクエストに対して、sampleディレクトリ直下のindex.htmlを返したい場合の例。
RewriteCond %{HTTP_HOST} ^.*sample.xyz$
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^.*$ /sample/index.html [L]
「http://sample.xyz/article/?id=123」のリクエストに対して、articleディレクトリ直下の123.htmlを返したい場合の例。
RewriteCond %{HTTP_HOST} ^.*sample.xyz$
RewriteCond %{REQUEST_URI} ^/article/$
RewriteCond %{QUERY_STRING} (^|&)id=([^&]+)($|&)
RewriteRule ^.*$ /sample/article/%2.html [L]
1行目の「.*」は、「http://sample.xyz」または「http://www.sample.xyz」のどちらでも対応できるように。
3行目の「(^|&)」は、クエリストリングの最初または「&」のどちらか。
3行目の「([^&]+)」は、「&」以外の1文字以上の文字列。
3行目の「($|&)」は、クエリストリングの最後または「&」のどちらか。
なお、RewriteCondで()で囲った文字列は4行目のRewriteRuleで参照可能。3行目では()が3ヵ所使われていて、目的のidの値「123」は2番目。よって4行目の「%2」は3行目で()で囲った「123」に置き換えられます。
また、RewriteRuleの変換元URLでも同様にグルーピングが可能で、URL「http://sample.xyz/article/?id=123」の「article」という文字列を置き換るには以下のように記述します。
RewriteRule ^(.*)/.*$ /sample/$1/%2.html [L]
※ RewriteCondは「%」。RewriteRuleは「$」であることに注意。
ドメインではなくIPアドレスによるアクセスの拒否
公開したWebサイトにIPアドレスでアクセスされたくない場合は以下のように設定します。
RewriteCond %{HTTP_HOST} ^.*127\.0\.0\.1$
RewriteRule ^.*$ - [R=403,L]
1行目の「127\.0\.0\.1」の「\」は、.(ドット)が正規表現として扱われるので「\」でエスケープ処理しています。
2行目の「R=403」は、403エラー(アクセス禁止)で応答するという指示。なお「L」は判定終了を意味しています。「L」がない場合、後続の判定処理が実行されてしまい、意図した動作とならない可能性があります。
トップドメインのアクセス拒否
RewriteCond %{HTTP_HOST} ^.*sample.xyz$
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^.*$ - [R=403,L]
ユーザーエージェントの文字列が空または特定URLのアクセス拒否
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{REQUEST_URI} ^/test/.*$
RewriteRule ^.*$ - [F]
1行目はユーザーエージェントの判定。[OR]でまたは。
2行目は特定URLの判定(http://example.com/test/の場合)。
3行目の[F]はForbidden(403、アクセス禁止)。
メンテナンス実施時の一時的なアクセスの拒否
ErrorDocument 503 /sample/maintenance.html
RewriteCond %{REQUEST_FILENAME} !(/sample/maintenance.html|.(gif|png|jpg|js|css))$
RewriteCond %{REMOTE_ADDR} !=xxx.xxx.xxx.xxx
RewriteRule ^.*$ - [R=503,L]
1行目は503エラー(サービス停止)時に表示するページの設定。(メンテナンス時は503が一般的、301とか他のだとGoogleのインデックスに影響する可能性あり)
2行目は503エラーから除外するファイル。(503エラー時に表示したいファイルを除外する)
3行目は503エラーから除外する管理者のIPアドレス。(これがないと管理者からもサイトを閲覧できなくなる)
メンテナンスが終了したら、上記の設定をコメントアウトまたは削除します。
旧サイトにアクセスされた場合などのリダイレクト
「http://old.sample.xyz」から「http://new.sample.xyz」へ、サイトリニューアルでドメインが変更された場合には、以下のように設定します。
RewriteCond %{HTTP_HOST} ^(.*)old.sample.xyz$
RewriteRule ^(.*)$ http://new.sample.xyz/ [R=301,L]
2行目の「R=301」はリダイレクトという意味。
301と302で多少異なるので、それについはこちら(301リダイレクトと302リダイレクトの違い)を参照。