mod_rewrite x RewriteRule条件の再検証
mod_rewriteに指定するRewriteRule条件部分に対しての、
条件指定の微妙な違いと挙動について、
指定例と実際の挙動についてご紹介しています。
RewriteRule全転送条件の指定比較
RewriteRuleにてドメインやディレクトリに要求があった際に、
すべて転送を行いたい場合もあります。
そうした際にまじないのように「^(.*)$」を指定して、
条件判定を行っていることも多いと思います。
そんな全転送を行う際の条件指定で、
以下のパターンと実際の挙動を確認しています。
- ^
- .
- .*
- $
- ^.*$
- ^(.*)$
- (.*)$と$1
- $
なんとなく「^(.*)$」を利用しがちですが大半は「^」で十分だったりします。
そんな全転送パターンのあれこれを以下で検証しています。
ルートディレクトリ検証
サブディレクトリ検証
RewriteRule条件の「.(ドット)」扱いの再検証
mod_rewriteのRewriteRuleに対して指定する一致条件の指定において、
「.」による指定がどのような挙動をみせるのかを検証しました。
いつも「.*」を利用しているものの、
実際のところ「.」がパスに対しての何にマッチしているのかを考えたことありますか。
以下のパターンと実際の挙動をご紹介しています。
- .{0}
- ^.{0}$
- .{0,}
- ^.{0,}$
- .{1}
- ^.{1}$
- .{1,}
- ^.{1,}$
- .{2}
- ^.{2}$
- .{2,}
- ^.{2,}$
RewriteRuleによるディレクトリ判定例
RewriteRuleにてドメインルートやディレクトリに要求があった際に、
転送を行うかの判定に記述した各条件と転送の可否を以下の条件で検証しています。
- /
- ^/?
- ^/+
- ^/*
- ^.
- ^
- $
- ^$
- dir/
- ^dir/
- ^dir
- dir$
まぁ、私がただ「ルートへの要求」が「/パスへの要求」になるもんだと勘違いしていて、
実際に検証を行っただけなのですが。
ルートへの要求が「空文字」になるという点が分かれば、
以下の検証は必要なかったような気もします。
ルートディレクトリ検証
サブディレクトリ検証
RewriteRuleで$0変数の利用
いつもおまじないのように書いている
「RewriteRule ^(.*)$ ~ $1」 ですが、そもそも$0という記述ができるとのことで、
$0を利用すると「.*」で十分でわざわざ変数に記憶する必要もないというのです。
実際に試したところ、確かに$0の使用で十分満たされるケースも多くあります。
詳細は以下でご紹介しています。
RewriteRuleで%{REQUEST_URI}の使用
上記の「$0」による記載は確かに便利です。
また違ったアプローチとして、
%{REQUEST_URI}サーバー変数を置換後文字列に指定するという方法もあります。
こちらは$0とは異なって、ドメインルートに配置した.htaccessと、
サブディレクトリ内に配置した.htaccessでは、
与えられるパスに若干の違いがありました。
.htaccessはルートにしか置かないというポリシーで運営をされているようなら、
$0 でもなく、%{REQUEST_URI}を利用するという方法も採用できます。
mod_rewriteでクエリ文字列(/?q=)を引き継がずにURL置換
mod_rewriteを利用したURL転送で、
クエリ文字列が付加されたURl形式での要求があった際に、
クエリ文字列を転送先URLに対して引き継がないように、
転送先URLを記載する手順について、以下でご紹介しています。
また[QSA]フラグを利用したクエリ文字列の付加についてもご紹介しています。
Apache,Apache Hadoop,Apache Subversion,Hadoop,HDFS,HBase,Hive,Mahout,Pigは、
Apache Software Foundationの米国およびその他の国における登録商標または商標です。
ApacheソフトウェアはApache Software License (原文)および
Apache License, 2.0 (原文)に基づきOpen Source Initiativeに承認されライセンスされています。
公開日:
最終更新日:2014/12/17