【NGINX】並列する location はマージされない

location / {
    index index.php index.html index.htm;
    try_files $uri $uri/ /index.php?$args;
}

location /develop {
    auth_basic "Basic Auth";
    auth_basic_user_file /etc/nginx/basic/htpasswd;
}

location ~ \.php$ {
    fastcgi_pass   phpfpm;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
}

上記、一見正しそうに見えるが、意図したであろうとおりに動かないです。

  • /develop/hoge.php でBasic認証は効かない
  • /develop でアクセス時に、try_files でやってるDirectorySlash (ディレクトリ名でアクセスしたときの末尾スラッシュ補完) 的なヤツは効かない
  • /develop/ でアクセス時に、 /develop/index.php は実行されない

こう書かないとだめ。

index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args;

location /develop {
    auth_basic "Basic Auth";
    auth_basic_user_file /etc/nginx/basic/htpasswd;

    index index.php index.html index.htm;
    try_files $uri $uri/ /index.php?$args;
}

location ~ \.php$ {
    fastcgi_pass   phpfpm;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;

    location ~ ^/develop/(.*)\.php$ {
        auth_basic "Basic Auth";
        auth_basic_user_file /etc/nginx/basic/htpasswd;

        fastcgi_pass   phpfpm;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
    }
}

ネストしたlocationの中身の継承に関しては、ディレクティブにより異なるらしい……

参考: Understanding the Nginx Configuration Inheritance Model