WordPress 管理画面に BASIC 認証を設定するときは、以下のように設定していました。
( PHP は http://backend で動いているプロセスにリバースプロキシしているものとします )
location = /wp-login.php {
# BASIC 認証
auth_basic "Secret Area";
auth_basic_user_file "/etc/nginx/conf.d/.htpasswd";
proxy_no_cache 1;
proxy_cache_bypass 1;
proxy_redirect off;
proxy_pass http://backend;
}
location ~* /wp-admin/(?!(admin\-ajax\.php|css/|js/|images/)).*$ {
index index.php index.html index.htm;
# BASIC 認証
auth_basic "Secret Area";
auth_basic_user_file "/etc/nginx/conf.d/.htpasswd";
proxy_no_cache 1;
proxy_cache_bypass 1;
proxy_redirect off;
proxy_pass http://backend;
}
ただ、これだと WordPress でパスワード保護された記事を書いた時にも BASIC 認証のダイアログが表示されてしまいます。
パスワード保護された記事を開くためには、WordPress では /wp-login.php?action=postpass
に対して POST します。
そのため /wp-login.php
に BASIC 認証がかかっていると、パスワード保護された記事を表示することができなくなってしまうのです。
そこで、以下のように変更し、 クエリストリングに ?action=postpass
があるときは BASIC 認証を無効にするように設定しました。
location = /wp-login.php {
# BASIC 認証
set $auth "Secret Area";
if ( $arg_action = "postpass" ) {
set $auth off;
}
auth_basic $auth;
auth_basic_user_file "/etc/nginx/conf.d/.htpasswd";
proxy_no_cache 1;
proxy_cache_bypass 1;
proxy_redirect off;
proxy_pass http://backend;
}