htaccess はデフォルトで親を拒否し、単一の正規表現の仮想サブパスを許可します

htaccess はデフォルトで親を拒否し、単一の正規表現の仮想サブパスを許可します

デフォルトではすべての匿名ユーザーを拒否しますが、特定の仮想パスに対しては匿名ユーザーを許可します。仮想パスはWordPressのhtaccess + phpによって作成されます。

現在の設定

AuthUserFile /var/www/domains/dev/.htpasswd
AuthType Basic
AuthName "Password Required"
Require user jackson dawna
Order Deny,Allow
Deny from All

<If "%{REQUEST_URI} =~ m#/sites/dawna/wordpress/wp-json/wp/v2/.*#">
        Order Allow,Deny
        Allow from All
        Satisfy Any
</If>

Satisfy Any

問題

上記のコードはすべてのユーザーを拒否し、資格情報を要求します。ただし、グローバルを に切り替えて に切り替えるとAllow from All、指定されたルートのみが拒否さIfDeny from All、期待どおりに動作します。

質問

他のすべてをパスワードで保護しながら、匿名の訪問者を仮想ルートに許可するにはどうすればよいですか?

答え1

どうやら、要求されたURLパスがないパブリックアクセスを許可する URL パス。それ以外の場合はアクセスを許可するだけです。

また、Apache 2.4 システムと思われるものに Apache 2.2 認証ディレクティブを混在させています。

代わりに次のようなことを試してください。

<If "%{REQUEST_URI} !~ m#^/this/urlpath/is/public/#">
    AuthUserFile /var/www/domains/dev/.htpasswd
    AuthType Basic
    AuthName "Password Required"
    Require user jackson dawna
</If>

上記は、要求された URL が始まっていないことを確認し/this/urlpath/is/public/(例では文字列の開始アンカーが欠落していました^)、始まっていない場合にのみ認証を求めます。デフォルトのアクションは、アクセスを許可することです (その URL パスで始まるすべての URL に対して)。

答え2

仮想パス(WordPress によって作成)の性質上、THE_REQUEST代わりに以下を使用する必要がありました。

<If "%{THE_REQUEST} =~ m#^GET /sites/dawna/wordpress/wp-json/#">
        Allow from All
        Satisfy Any
</If>

wordpress リダイレクトは を使用するwordpress/index.phpので、 の使用はREQUEST_URI機能しませんでした。これは、 uri が常に/path/to/wordpress/index.phpmy if ステートメントを役に立たなくするためです。

注記

PUT やその他のものをサポートする必要がある場合は、それを追加する必要があります。[A-Z]{3}または、[A-Z]{3-6}後者はすべてに開かれます。

関連情報