2021.11.24 システム
WordPressサイトで一部ページをベーシック認証解除する方法
WordPressのサイトで全体にベーシック認証を掛けていたのですが、ある案件で、一部だけベーシック認証を解除する必要があり、少しだけハマったので共有したいと思います。
まずは、通常通り、WordPressのサイトの「.htaccess」にて以下の通り、全体にベーシック認証をかけているとします。
AuthType Basic
AuthName “Password Required”
AuthUserFile /xxxxxxxxxx/.htpasswd
例えば、/test/フォルダ以下にアクセスされた場合は、ベーシック認証を解除したい場合
通常のサイトであれば、以下のように「Request_URI」が「/test/*」だったら任意の環境変数(valid-uri)を設定して、認証を通ったユーザ(valid-user)か、環境変数(valid-uri)を持っている場合は、アクセス許可を行うことで、ベーシック認証を除外することが出来ます。
AuthType Basic
AuthName “Password Required”
AuthUserFile /xxxxxxxxxx/.htpasswd
# 特定URLのとき環境変数設定
SetEnvIf Request_URI “^/test/*” valid-uri
# 以下の場合アクセス許可
<RequireAny>
Require valid-user
Require env valid-uri
</RequireAny>
しかし、WordPressで何度調整してもうまくいきません。。。。
調べてみると、以下のWordPress特有のリダイレクトが影響していることが分かりました。
RewriteBase /
RewriteRule ^index.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
それぞれ「.htaccess」に何が書いてあるかというと、
まず「RewriteRule ^index.php$ – [L]」の部分は、「リクエストされたファイル名がindex.phpなら、何もしない。
「RewriteCond %{REQUEST_FILENAME} !-f」や「RewriteCond %{REQUEST_FILENAME} !-d」で、実際のファイルやディレクトリの実ファイルが存在しない場合、「index.php」へリダイレクトする。と記載されています。
WordPressは、index.php上で、アクセスされたURLを判断し、対象ページを生成しているのです。
例えば、「/test/xxxx」というページにアクセスしたときにどういう動きになるかというと。。。。
<「/test/xxxx」ページを表示する際の処理の流れ>
①Request_URIが「^/test/*」に一致するので環境変数「valid-uri」をセット
②「valid-uri」が存在するので、アクセス許可(ベーシック認証解除)
③「/test/xxxx」という実ファイルが無いので、index.phpへリダイレクト
④リダイレクトされるので「valid-uri」の環境変数が無くなり、ベーシック認証表示
⑤WordPressのページ生成
という形で、①~③でベーシック認証は解除できているのですが、④~⑤の通り、WordPressでページ生成するためにリダイレクトが走り、環境変数が無効になってしまい、結局ベーシック認証が出てしまっていたのです。。。
なんとか良い方法が無いか、、、調査したところリダイレクトした後のページで「REDIRECT_」というプレフィックスが付いた状態で環境変数が保持されるという記事を発見しました。
試しに、phpinfo関数を使って確認してみると、確かに「REDIRECT_valid-uri」という名前の環境変数が定義されていました。
そこで、ベーシック認証の部分を以下のように記載したところ、リダイレクト後も環境変数が保持されて、特定ページでベーシック認証を解除することが出来ました。
AuthType Basic
AuthName “Password Required”
AuthUserFile /xxxxxxxxxx/.htpasswd
# 特定URLのとき環境変数設定
SetEnvIf Request_URI “^/test/*” valid-uri
# 以下の場合アクセス許可
<RequireAny>
Require valid-user
Require env valid-uri
Require env REDIRECT_valid-uri
</RequireAny>
<「/test/xxxx」ページを表示する際の処理の流れ>
①Request_URIが「^/test/*」に一致するので環境変数「valid-uri」をセット
②「valid-uri」環境変数が存在するので、アクセス許可(ベーシック認証解除)
③「/test/xxxx」という実ファイルが無いので、index.phpへリダイレクト
④リダイレクトされるので「valid-uri」の環境変数が無くなるが、「REDIRECT_valid-uri」として環境変数を保持
⑤「REDIRECT_valid-uri」環境変数が存在するので、アクセス許可(ベーシック認証解除)
⑥WordPressのページ生成
これで無事に、WordPressサイトで特定ページのみベーシック認証を解除することが出来ました。
これを応用すれば、特定IPを除外も実施可能だと思います。
この様に、WordPressのノウハウを随時溜め込んでおりますので、どのようなサイトでも構築することが可能です。
サイト制作にお困りのことがございましたら、ぜひ弊社までご相談ください。