2021.01.28.htaccessて、どうも苦手なんですよね。正規表現が思った通りにマッチしなかったり意味不明な無限ループに陥ってしまうんですよね。先日も例によって.htaccessで正規表現のマッチングがどうもうまく行っていないような現象に遭遇。なんとかマッチングに使われている文字列を表示できないかなーなんて探していたら、ズバリありました。結論から先に書くと、以下のような感じで目的とするHTTP環境変数をクエリストリングに出力することができます。[R,END]これで、例えばhttps://mydomain.com/admin/index.phpなんてURLにアクセスすると、ブラウザのアドレスバーにHTTP環境変数が表示されます。実際にやってみた様子を見てみましょう。こんな感じで対象のファイルにアクセスすると、、、すると、ブラウザのアドレスバーに目的のHTTP環境変数が出てきます。http://mydomain.com/?REQUEST_FILENAME=/var/www/html/test/admin/index.php&REQUEST_URI=/admin/index.php—(index.php)これで、/admin/index.phpにアクセスしたときに.htaccessで処理されているHTTP環境変数は以下のようになっていることが分かります。無謀にも簡単に解説してみます。前半部分を見てみます。/?REQUEST_FILENAME=%{REQUEST_FILENAME}~(省略)この部分、RewriteRuleの基本構文は以下です。書き換え先そして、書き換え元パターンに^(.*)$を書いているので、全ての文字列にマッチします(つまり、どんなURLでも書き換えが発生するという意味)。次に、書き換え先を見てみます。/?REQUEST_FILENAME=%{REQUEST_FILENAME}最初が/?となっています。書き換え先を空文字とし、すぐにクエリストリングを記述に入っています。クエリストリングについての解説はいろいろあるのですが、要はURLの最後に?に続けて「変数1=値&変数2=値」の形式で書いてやると、変数1と変数2をプログラムに渡すことができる、というものです(詳しくは自分でググってください)。これを踏まえて「?」以降を見ると、クエリストリングがREQUEST_FILENAME=%{REQUEST_FILENAME}となっています。前半の「REQUEST_FILENAME=」はプログラムに渡す変数名がREQUEST_FILENAMEである事を示しています。次に%{REQUEST_FILENAME}の部分の%{***}は、HTTP環境変数を参照するための書式です。この場合はREQUEST_FILENAMEという環境変数を参照しています。ここまでくると、以下の書き方は環境変数REQUEST_FILENAMEとREQUEST_URIをクエリストリングに書き込んでいることが分かります(複数の変数を&で区切っているだけ)。/?REQUEST_FILENAME=%{REQUEST_FILENAME}&REQUEST_URI=%{REQUEST_URI}そして、次に「—($1)」が来ています。[R,END]ここは、あまり決まった書式はないのですが、$1という書き方だけは覚えておく必要があります。これは、書き換え元パターンで指定した部分を、書き換え先文字列内で参照するためのものです。言葉で書いても全く意味が分からないのですが、かなり乱暴な言い方をすると、書き換え元の()にマッチする部分を切り出して、書き換え先で使えるようにしてくれる、といった感じでしょうか。イメージ的にはこんな感じでしょうか。書き換え元のカッコ()は必ず必要です。いうか、このカッコに囲まれた部分だけを、書き換え先で使うことができます。書き換え先でここでは—()という書き方をしましたが、これに深い意味はありません。別に「$1」と書くだけでも成立しますが、少し見やすいように—を入れた程度の意味合いです。カッコも別に必要ありません。なんとなく、キャプチャした文字列であることが分かりやすいようにカッコでかこっただけです。上の例での結果を見ると、「index.php」となっているので、アクセス先のパスを含めないファイル名のみが入っているようです。あれ?そうだったかな、、、?そんなはずないんですけど手元のテスト環境ではそうなっているようです汗さて、予想以上に長くなってしまいましたが、最後に以下のようなオプションがついています。[R,END]Rをつけるとアドレスバーに表示される文字列もリダイレクト先のURLに変更されます。Rをつけないと、アドレスバー上で何も変化が起こらないので意味がありません。次に、ENDをつけると、そこで.htaccessの処理を停止します。2.3以降でないと使えないようです。注意点この方法でHTTP環境変数を出力する場合は、いろんな注意点があります。注意1:運用中の本番環境には入れないようにしましょう。当たり前ですが本番環境に入れたらすべての利用者にセンシティブな情報を晒してしまうことになります。