2016.5.15
2020.1.7

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リダイレクトの違い)を参照。

参考リンク

Apache】関連記事