web-dev-qa-db-ja.com

Apache.htpasswdはサブディレクトリに適用されません

いくつかのWordPressステージングサイトがステージングディレクトリに配置されています。ステージングディレクトリには、.htaccessと.htpasswdがあります。

.htaccess:

AuthType Basic
AuthName "restricted area"
AuthUserFile /var/www/staging/.htpasswd
require valid-user

.htpasswd

username:PdadsaasdMehzdsadwad

このディレクトリにファイルを配置すると、認証プロセスが適切にトリガーされますが、サブディレクトリにWordPressサイトを配置すると、認証が表示されません。

例WPサイト:/ var/www/staging/some-wp-site

.htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

WPサイト仮想ホスト:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName somewpsite.com
        ServerAlias somewpsite.com
        DocumentRoot /var/www/staging/some-wp-site
        <Directory />
                AllowOverride All
        </Directory>
        <Directory /var/www/staging/some-wp-site>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride all
                Require all granted
        </Directory>
</VirtualHost>

私のApache.conf

<Directory /var/www/staging>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
</Directory>

認証を使用するために仮想ホストを変更する必要があると思いますが、そのディレクトリにはかなりの数のサイトがあるので、別の構成が何を言っているかに関係なく、このサブディレクトリに配置されたファイルを単にトリガーするgloblルールがあればいいと思います。これは可能ですか?

2
Daniel Klose

問題は、メインのApache構成ファイルにアクセスできるにもかかわらず、.htaccessファイルを使用していることです。

一般に、メインサーバー構成ファイルにアクセスできない場合にのみ.htaccessファイルを使用する必要があります。たとえば、ユーザー認証は常に.htaccessファイルで行う必要があるという一般的な誤解があり、最近では、mod_rewriteディレクティブを.htaccessファイルに含める必要があるという別の誤解があります。これは単にそうではありません。 https://httpd.Apache.org/docs/2.4/howto/htaccess.html

この場合、.htaccess/var/www/stagingファイルが適用されないという予期しない動作が発生します。これは、私が知る限り、ApacheはDocumentRootで見つかった.htaccessファイルのみを検索して適用するためです。ディレクトリ以下。つまり/var/www/staging/some-wp-siteとそのサブディレクトリのみ。

メインのhttpd.confにディレクトリブロックを作成して/var/www/stagingでの認証を要求すると、すべてのサブディレクトリと、そこにDocumentRootがあるすべての仮想ホストにも適用されると確信しています。

1
HBruijn

問題は、Require all granted内の<Directory>コンテナ内の<VirtualHost>ディレクティブが、parentディレクトリ内の.htaccessファイル内の認証ディレクティブをオーバーライドしていることです。 。これを削除し、代わりに/var/wwwディレクトリへのアクセスを許可し(「ステージング」領域外のサイトがある場合)、実行しているように/var/www/stagingサブディレクトリへのアクセスを制限する必要があります。 .htaccessではなく、サーバー構成でこれを行うことをお勧めします。

<Directory />
    AllowOverride All
</Directory>

また、ルートディレクトリにAllowOverride Allを設定しないでください。 Apacheドキュメントは特に警告します これを行う:

セキュリティとパフォーマンス上の理由から、<Directory "/">ブロックでAllowOverrideをNone以外に設定しないでください。

したがって、/var/www/staging/.htaccessファイルを削除し、vHostファイルとApache.confファイルを次のように作り直します。

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName somewpsite.com
    ServerAlias somewpsite.com
    DocumentRoot /var/www/staging/some-wp-site
    <Directory /var/www/staging/some-wp-site>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All                
    </Directory>
</VirtualHost>

Apache.conf

<Directory />
    AllowOverride None
    Require all denied
</Directory>

<Directory /var/www>
    Require all granted
</Directory>

<Directory /var/www/staging>
    Options Indexes FollowSymLinks MultiViews
    AuthType Basic
    AuthName "restricted area"
    AuthUserFile /var/www/staging/.htpasswd
    Require valid-user
</Directory>

特にこれらを使用していない限り、MultiViews(およびIndexes)も無効にすることをお勧めします。そうしないと、MultiViewsはおそらく将来のある時点でmod_rewriteと競合することになります。

1
MrWhite