我有几个 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 发生冲突。