Apache .htpasswd 不适用于子目录

Apache .htpasswd 不适用于子目录

我有几个 WordPress 暂存网站放在暂存目录中。暂存目录包含 .htaccess 和 .htpasswd

.htaccess 文件:

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

密码

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>

我怀疑我需要修改 vhost 才能使用身份验证,但由于我在该目录中有相当多的站点,因此我更希望有一个全局规则,无论其他配置如何,它都会针对放置在此子目录中的任何文件触发。这可能吗?

答案1

问题确实是,.htaccess即使您可以访问主 Apache 配置文件,但您仍然在使用文件。

一般情况下,您只应在无法访问主服务器配置文件时使用 .htaccess 文件。例如,有一种常见的误解,认为用户身份验证应始终在 .htaccess 文件中完成;近年来,又有一种误解,认为 mod_rewrite 指令必须放在 .htaccess 文件中。事实并非如此。https://httpd.apache.org/docs/2.4/howto/htaccess.html

.htaccess在这种情况下,会发生未应用文件中的意外行为 /var/www/staging,因为据我所知,Apache 将仅搜索并应用.htaccess在 DocumentRoot 目录及其以下目录中找到的任何文件。即仅/var/www/staging/some-wp-site及其子目录。

我相当确定,如果您在主 httpd.conf 中创建一个目录块以要求进行身份验证,/var/www/staging它也将适用于所有子目录和其中的每个虚拟主机DocumentRoot

答案2

问题是容器中Require all granted的指令覆盖了文件中的身份验证指令<Directory><VirtualHost>.htaccess父母目录。应将其删除,并允许访问/var/www目录(如果您的站点位于“暂存”区域之外)并限制访问/var/www/staging子目录,就像您正在做的那样,尽管最好在服务器配置中执行此操作,而不是.htaccess

<Directory />
    AllowOverride All
</Directory>

此外,您永远不应将其设置AllowOverride All为根目录。Apache 文档特别警告这样做:

出于安全和性能原因,请不要在您的块中设置AllowOverride为除 None 之外的任何内容。<Directory "/">

因此,删除该/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 发生冲突。

相关内容