当サイトはプロモーションが含まれています。

NGINXで「BASIC認証+PHPファイル」がうまくいかなかった話

サーバー

普段の案件ではApacheばかりなので、NGINXに関してはまだまだな筆者ですが、BASIC認証を設置した時に少しトラブりました。

BASIC認証設置前は以下のようにPHPファイルに対するlocationが存在していました。

location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
  include        fastcgi_params;
}

Apache歴が長い筆者は、次のように記述しました。

location ^~ /basic/ {
  auth_basic "MemberOnly";
  auth_basic_user_file "/path/.htpasswd";
}

location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
  include        fastcgi_params;
}

結果、/basic/へのアクセスはBASIC認証が行われるようになりましたが、/basic/以下のPHPファイルへアクセスすると実行されずにダウンロードされてしまう状態に…。

よく調べてみると、NGINXのlocationはどれか1つに該当すると、他(同評価下のlocation)は無視される仕様なので、以下のような記述にするとうまく動きました。

location ^~ /basic/ {
  auth_basic "MemberOnly";
  auth_basic_user_file "/path/.htpasswd";
  location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    include        fastcgi_params;
  }
}

location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
  include        fastcgi_params;
}

なんだかなぁ…。もっとスマートな方法がある気がします。