Naba Blog

プログラミングとか作曲など色々

Apache2のSetEnvIfでURIオプションはマッチできないっぽい

naba.hatenablog.jp

前回の記事でドヤ顔で完璧とか書いたのに、実際はうまくマッチできていなかったのでそのお話の続き。

前回の記事で最後に、

SetEnvIf Request_URI "^.*(\?|=|%|\$|#).*" nolog

とかいう意味不明なことをドヤ顔で書いたけど、これ結構間違ってたね。

まず、先頭マッチングとか後半に何か続くとか、そんなもの要らなかったね

だって、拡張子のマッチングミスって.pngのつもりがpngになっててapngaにもマッチングしちゃうね~HAHAHAとか話題に上がってるし、

それだけを考えて特殊文字とかをマッチングさせるなら

SetEnvIf Request_URI "\?|=|%|\$|#" nolog

でいいはずだ。

ちなみにこの時点で=%$がマッチングに成功してnologになっている。

では何故?#にマッチングしなかったのか。

それは、URIのリクエスト時に?及び#はURIリクエストのオプションとして認識されるからである。

よくあるのが/hogehoge.php?fuge=hogeなど(php自体よく知らないが)。

この場合、URIリクエストは/hogehoge.phpまでであるため、

?以降はマッチングの対象にならないのである。

同様に、例えば/hogehoge#fugaなどの場合。

この場合も、#がページ内のインデックスに使用されるため切り捨てられ、

実際のURIリクエストは/hogehogeまでであるので、

#以降はマッチングの対象にはならない。

 

そもそも私が?nologにしようと思った理由が、

/hogehoge.php?fugaが邪魔だったからであり、

それならそもそも.phpを除外すればいい話であり(現時点はそうしてる)、

まぁこれで上手くマッチできなかった理由も分かったことだし、

万々歳?みたいな?

結局私のSetEnvIfは、拡張子のマッチングも含めて

SetEnvIf Request_URI "\.(gif|jpg|png|JPG|ico|js|css|woff|php|svg|mp3|mp4)$" nolog
SetEnvIf Request_URI "\?|=|%|\$|#" nolog

に落ち着きました。

え、結局?#入れてるって? 気にしない気にしない。

以上です。