正規表現を調べていたら・・・

こんな記事が。

以前、私のblogでもapacheで画像ファイルへのアクセスログをとらないようにするために、

SetEnvIf Request_URI “\.(jpg)|(png)|(gif)$” nolog
CustomLog /var/log/httpsd/access_log combined env=!nolog

みたいに書けばいい、と言って、実際にそうやって書いてapacheを稼働させていました。
もちろんこれで私にとっては何の不都合もなかったのですが、上記参照先によると、この正規表現はダメなんだそうです。

自分なりに分解して見たところ、まず「\.」がピリオドを表し(バックスラッシュは.を.として認識させるため)、(jpg)でjpgという文字列を一括りに、以下(png)(gif)とも同様、「|」はいわゆるor、そして「$」は最後の文字列として、という指定です。

このSetEnvIfでイメージしていたのはようするに*.jpg、*.png、*gifというファイルへのアクセスはログをとらない、ということですが、上のような書き方だと「$」がかかるのは最後の(gif)だけになってしまい、条件は*.jpg**png**gifになってしまうらしいんです。
つまり、「ピリオド+jpgの文字列」を含む一切の文字列、または「pngの文字列」を含むすべての文字列、そして「gifで終わる」最後の文字列、ということに。
これだと、例えばshopng.htm(ショッピングの綴りを間違ってファイル名にしている)ようなページへのアクセスも、二つ目の検索条件にひっかっかってしまい、ログがとられないことになってしまいます。

条件は「ピリオドで始まってjpgかpngかgifで終わる」なので、これを正規表現に当てはめると

\.(jpg|png|gif)$

とならなくてはいけない(らしい)。
なるほどこれならjpgかpngかgifのどれかを一括りとして、その頭に.がついている最終文字列、という指定になるんですね。

さっそく修正して稼働させてみました。
今のところ実害らしい実害はなかった(というか、実害その物がなかった)ので、その効果のほどを体感することはできないのですが、正しく運用している、というその意識が少し誇らしく(?)もありますよね(笑)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)