特定のページ(URL)のみベーシック認証をかける(アドレスでベーシック認証)


ワードプレスを使って商品一覧ページを作っているけれど、
商品ページが変更になった、商品がなくなった。

商品一覧ページから該当ページを削除すればよいのですが、・・・・・
やり方がわからない。
理由:作った人がやめた。ワードプレスよくわからない。
※依頼理由のNO1です。

で、
1 商品一覧ページのうち、すでにない商品のページをクリックしたときだけ、ベーシック認証をかけてほしい
2 商品一覧ページのうち、作成中のページをクリックしたときもベーシック認証をかけてよしい

こんなときは
特定のURLを含むページのみベーシック認証をかけるで対応しました。

前提
・環境はさくらのレンタルサーバー
・.htaccessを使う
・ワードプレスでURLが自動生成されている

結論
URLにmenuとdevが含まれているときはベーシック認証がかかる

.htaccessベーシック認証 
1 DirectoryIndex index.html index.htm index.shtml index.php index.cgi
2 Options -Indexes
3 AuthUserFile /home/〇〇〇/www/〇〇〇/ridirect/.htpasswd
4 AuthType Basic
5 AuthName "Web access"
6 Require valid-user
7 SetEnvIf Request_URI "(menu|dev)" auth_chk
8 Satisfy any
9 Order deny,allow
10 Deny from env=auth_chk

③と⑦を変えれば動きます。

①~⑥

さくらのレンタルサーバーの初期値なのでこちらの説明を参考に

7 SetEnvIf Request_URI "(menu|dev)" auth_chk

URLにmenuかdevが含まれていたら、変数auth_chkに1を設定する

7-1 SetEnvIfの使い方

SetEnvIt ① ② ③

①ここには リクエストを表す値を設定します。
設定できる値は決まっていて、値は↓記載の公式サイトで確認できます。

今回はURLを取得したいので
Request_URIになります。

その他、
Remote_Addr・・・リクエストを行なっているクライアントの IP アドレス
などたくさんあります。

参考:SetEnvIf Apache公式サイト
http://httpd.apache.org/docs/2.2/ja/mod/mod_setenvif.html#setenvif

②ここには正規表現を書きます。
今回は単純に menuかdevが含まれている場合なので(menu|dev) にしました。

③ ①と②の条件を満たす場合 変数を設定する
今回はURLにdevもしくはmenuが含まれる場合変数auth_chkに1を設定しています。
・変数名は自由
・変数に値を設定していない場合は1が設定される
※auth_chkが決まった変数名に思えますが、これは自由に設定した変数名です。

8 Satisfy any

AuthUserFile /home/〇〇〇/www/〇〇〇/ridirect/ 以下にアクセスしてもベーシック認証のダイアログがでてこないようにする。

8-1 Satisfy any

ホストによる制御
ユーザー認証による制御
どちらかを満たしていればOKということ

今回はさくらのレンタルサーバーなので、
ホストによる制御→海外からのIPアドレス制限
ユーザー認証による制限→特になし

国内からのアクセスのためホストによる制限を満たしている
→ホストによる制御をみたしている
→ホストによる制御、ユーザー認証による制御のどちらか一方を満たしているということで
ベーシック認証のダイアログがでてこなくなります。

※初期値Satisfy all のままだと、ベーシック認証のダイアログがでてきます。

Satisfy Apache公式サイト:
https://httpd.apache.org/docs/2.4/ja/mod/mod_access_compat.html#satisfy

9 Order deny,allow

すべてのアクセスをOKにする。
ここはベーシック認証のダイアログがでてくる、でてこないの話ではなく、
アクセスする権限があるかどうかということ。

ここは混乱しました。
アクセスする権限があるけれど、
あなたはベーシック認証のダイアログにIDとパスワードをいれてね、
あなたはベーシック認証無しでアクセスできるよ
という話のようです。

10 Deny from env=auth_chk

auth_chkの値が1の人はベーシック認証のダイアログを表示する
URLにmenuもしくはdebが含まれている人はauth_chkの値が1です。⑦参照

Q ここででてくるenvってなんんでしょう
これも勝手につかっていいのでしょうか。

A これはDeny、Allowの引数で
環境変数 の存在によりアクセスの制御を行なえるようにするものです。

env=環境変数の形式で使います。
envとは決まった名前です。

今回の場合、 環境変数 auth_chkが存在した場合にリクエストはアクセスを拒否されます。
なので、

Apacheの公式サイト Allowのところに詳しくのっています。
https://httpd.apache.org/docs/2.4/ja/mod/mod_access_compat.html#allow
https://httpd.apache.org/docs/2.4/ja/env.html#using

現在この記述は別のサイトでもコピペされて大活躍しています。
めでたし、めでたし。
Satisfy anyのところはなんとなくの記述なので、ご指摘があればお願いいたします。

■参考サイト追記
https://www.magata.net/memo/index.php?Apache2.4%20%A4%CERequire%A5%C7%A5%A3%A5%EC%A5%AF%A5%C6%A5%A3%A5%D6%A4%C7%A5%A2%A5%AF%A5%BB%A5%B9%C0%A9%B8%E6%A4%F2%B9%D4%A4%A6