Webエンジニアの備忘録

およそ自己の作業メモとして残しております。

nginxでrestfulアクセス対応

昨日、twitterのアクセストークンが消し飛ぶという謎の事象にまる1日悩まされました。
アクセスログなどを追ってみたところ、faviconへのアクセスがウェブアプリへのアクセスと誤認され、ヒットしないアクションだったせいでドキュメントルートにリダイレクトされ、そのアクセスがトークンを再発行してしまっていました。
なんという連続コンボ…
fuelPHPなど、restfulなURL対応のために.htaccessを書き換えたりする機会が増えましたが、nginxについては設定・調査が甘かったので、改めて書きなおしたものを晒してみます。

server {
    server_name     *******.jp;
    root            /var/www/public;
    charset         utf-8;
    index           index.php;

    access_log      /var/log/nginx/access_log;
    error_log       /var/log/nginx/error_log;

    # ディレクトリを避ける (asset)
    # 画像やCSSなどはassetディレクトリに集約して避ける
    location ^~ /asset/ {
        access_log off;
        log_not_found off;
    }
    # 直下ファイルを避ける (favicon.ico)
    # 勝手に呼び出されるので、これも明示的に避けておく
    location = /favicon.ico {
        access_log off;
        log_not_found off;
    }

    # 上のファイルに該当しないアクセスはトライしてみる
    # PHPのアクセスがここに来る
    location / {
        try_files $uri $uri/ @webapp;
    }
    location @webapp {
        rewrite ^/(.*)$ /index.php?$1 last;
    }
}

locationにヒットした順に処理からは抜けるようなので、アプリアクセスURLを残して除外していくように記載すればよさそうです。

ちなみに、画像やfaviconアクセスはログを落とさないよう、access_logをoffしてます。

この良し悪しはサービスの用途によりますね。