純規の暇人趣味ブログ

首を突っ込んで足を洗う

[Apache/nginx]正しい画像ログ除外の設定

      2017/05/26    HimaJyun

Apacheだろうがnginxだろうが「Webサーバのログから画像を除外する」なんて設定は良くあると思います。

知っている人にとっては超どうでもいい小ネタですが、たまに間違った設定を見かける事があるので、正しい設定をメモ代わりに記事にしておこうと思います。

正規表現

たまーに正規表現が間違ってるパターンもあります。

先に言っておくと、私は以下のように設定しています。

\.(?:css|js|ico|png|jpe?g|gif)

一般的に紹介されているものとはちょっと異なる、?:の部分とか特に

間違いパターン

間違いパターンがこれ

\.(css)|(png)|(gif)$

いや、まさかこんな正規表現……存在しないと信じたいんだけど……たまに見かけるんだよね。

これだと「.css」「png」「gif」にヒットします、すなわちpng.htmlでもgif/index.phpでもヒットしてしまう。

何がタチ悪いって、一応image.pngにもヒットするから間違いに気づかない事。

正しくは「\.(css|png|gif)$」です。

非キャプチャグループで高速……?

これはあまり見ない、というか自分で考えて設定しているのですが

\.(?:css|js|ico|png|jpe?g|gif)

太字の部分の「?:」は非キャプチャグループと言って、文字通りキャプチャしないグループ。

普通に「()」で囲んだだけでは、マッチした部分がキャプチャされて後から$1で参照できたりします。

今回の場合はキャプチャされても基本的に使わないので「?:」でキャプチャしないようにしています。

少しでも高速になれば良いなぁ、と思って(実際に測定した訳ではないので効果は不明、殆ど無意味だとは思う)

設定

次に、サーバの設定です。

基本的に「正規表現でマッチさせる際に大文字小文字を区別しないようにする」のがポイントです。

Apache

ApacheではよくSetEnvIfが使われますが、これは大文字小文字を区別します

大文字小文字を区別しないSetEnvIfNoCaseが用意されているのでこちらを使いましょう。

つまりこんな感じ

SetEnvIfNoCase Request_URI "\.(?:css|js|ico|png|jpe?g|gif)$" no_log
CustomLog ${APACHE_LOG_DIR}/access.log combined env=!no_log

nginx

nginxでもやはり大文字小文字の区別の区別、つまり大文字小文字を区別するかどうかってのはあります。

また、nginxではlocationとifが用意されていてややこしいのですが、個人的には特別な理由がない限りlocationの方が良いかと思っています。

location ~* \.(?:css|js|ico|png|jpe?g|gif)$ {
  access_log off;
}

ポイントは「~*」の部分、これは大文字小文字を区別しない正規表現マッチ

もしこれが「~」だったりしたら大文字小文字を区別されてしまう。

基本的に拡張子は小文字で書かれていると思うが、稀に何かの拍子で大文字になっていることがあるので、区別しない方が便利。

終わりに

ブーメランになると痛いので自分も100%正解だとは言わないが、個人的には今回紹介した設定が正解だと思っている。

 - サーバ運営 ,