system
大貫 晃一

2021.11.24システム開発 

システムエンジニア

大貫 晃一

2021年8月1日「マリンロード」は「インソースマーケティングデザイン」へ社名を変更いたしました

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特有のリダイレクトが影響していることが分かりました。

RewriteEngine On
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のノウハウを随時溜め込んでおりますので、どのようなサイトでも構築することが可能です。
サイト制作にお困りのことがございましたら、ぜひ弊社までご相談ください。

WEBサイト診断 現役ウェブ解析士が教えるWebサイトの読み解き方 イメージ
システム開発サービスはこちら
ページTOPへ