当站点不在根目录时,密码保护WordPress wp-admin

时间:2014-01-14 19:00:04

标签: wordpress .htaccess mod-rewrite directory password-protection

以下是我的问题的简要概述:我为不在根目录中的网站的WordPress wp-admin目录添加了密码保护,但现在整个网站都要求用户名和pawword身份验证,而不仅仅是wp-admin目录/ WordPress登录页面。我想密码保护WordPress wp-admin目录和wp-login.php页面,但我不希望每个其他页面都提示输入用户名和密码。现在有些细节(对此道歉很久)......

我有一个共享主机帐户,我在同一个帐户下托管多个WordPress网站。在根目录(public_html)是我自己的网站,然后在他们自己的子目录中有几个其他网站。最近,我为每个站点的wp-admin目录和wp-login.php文件添加了密码保护。

所以文件结构如下所示:

my-site
    site-1
        wp-admin
    site-2
        wp-admin
    wp-admin  /* this is the wp-admin directory for my site */

我将以下内容添加到我网站的wp-admin目录中的.htaccess文件中,这样就可以了 - 它会按预期为我网站的wp-admin目录添加密码保护。

ErrorDocument 401 "Access Denied"
ErrorDocument 403 "Access Denied"
AuthName "MySiteUser"
AuthUserFile "/home/my-site/.htpasswds/public_html/wp-admin/passwd"
AuthType Basic
require valid-user

然后我将以下代码添加到我网站根目录中的.htaccess文件中:

<FilesMatch "wp-login.php">
ErrorDocument 401 "Access Denied"
ErrorDocument 403 "Access Denied"
AuthName "MySiteUser"
AuthUserFile "/home/my-site/.htpasswds/public_html/wp-admin/passwd"
AuthType Basic
require valid-user
</FilesMatch>

这也可以按预期工作 - 它会按预期为我网站的wp-login.php页面添加密码保护。到目前为止,非常好。

当我向不在根目录中的其他站点添加密码保护时,问题就开始了。除了 AuthUserFile 语句中的其他目录级别之外,这几乎与我添加到我的站点的内容完全相同。例如,我将以下内容添加到我的site-1的wp-admin目录中的.htaccess文件中:

ErrorDocument 401 "Access Denied"
ErrorDocument 403 "Access Denied"
AuthName "Site1User"
AuthUserFile "/home/my-site/.htpasswds/public_html/site1.com/wp-admin/passwd"
AuthType Basic
require valid-user

我还将包含在FilesMatch标签中的相同代码添加到site-1根目录中的.htaccess。

<FilesMatch "wp-login.php">
ErrorDocument 401 "Denied"
ErrorDocument 403 "Denied"
AuthName "Site1User"
AuthUserFile "/home/my-site/.htpasswds/public_html/site1.com/wp-admin/passwd"
AuthType Basic
require valid-user
</FilesMatch>

这个确实密码保护wp-admin目录和wp-login.php页面,现在,site-1上的每个页面都要求进行身份验证。该页面呈现OK,但弹出窗口会询问用户名和密码。如果我点击取消,对话框关闭,我可以看到正常的页面;当我刷新页面或转到另一个页面时,我再次被要求进行身份验证。另一方面,如果我点击OK,则认证对话框不再出现;但后来我无法访问wp-admin目录或wp-login页面(我得到一个“页面没有正确重定向”的消息)。

我怀疑某处有重写规则会导致这种情况发生,但我不知道它是什么。以下是我网站根目录中的整个.htaccess:

ErrorDocument 401 "Access Denied"
ErrorDocument 403 "Access Denied"
# BEGIN W3TC Browser Cache
<IfModule mod_deflate.c>
    <IfModule mod_headers.c>
        Header append Vary User-Agent env=!dont-vary
    </IfModule>
        AddOutputFilterByType DEFLATE text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/html text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon application/json
    <IfModule mod_mime.c>
        # DEFLATE by extension
        AddOutputFilter DEFLATE js css htm html xml
    </IfModule>
</IfModule>
# END W3TC Browser Cache
# BEGIN W3TC Page Cache core
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP:Accept-Encoding} gzip
    RewriteRule .* - [E=W3TC_ENC:_gzip]
    RewriteCond %{REQUEST_METHOD} !=POST
    RewriteCond %{QUERY_STRING} =""
    RewriteCond %{REQUEST_URI} \/$
    RewriteCond %{HTTP_COOKIE} !(comment_author|wp\-postpass|w3tc_logged_out|wordpress_logged_in|wptouch_switch_toggle) [NC]
    RewriteCond "%{DOCUMENT_ROOT}/wp-content/cache/page_enhanced/%{HTTP_HOST}/%{REQUEST_URI}/_index.html%{ENV:W3TC_ENC}" -f
    RewriteRule .* "/wp-content/cache/page_enhanced/%{HTTP_HOST}/%{REQUEST_URI}/_index.html%{ENV:W3TC_ENC}" [L]
</IfModule>
# END W3TC Page Cache core
# 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>
# END WordPress
<FilesMatch "wp-login.php">
ErrorDocument 401 "Access Denied"
ErrorDocument 403 "Access Denied"
AuthName "MySiteUser"
AuthUserFile "/home/my-site/.htpasswds/public_html/wp-admin/passwd"
AuthType Basic
require valid-user
</FilesMatch>

这是来自site-1根目录的整个.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>
# END WordPress
ErrorDocument 401 "Denied"
ErrorDocument 403 "Denied"
<FilesMatch "wp-login.php">
ErrorDocument 401 "Access Denied"
ErrorDocument 403 "Access Denied"
AuthName "Site1User"
AuthUserFile "/home/my-site/.htpasswds/public_html/site1.com/wp-admin/passwd"
AuthType Basic
require valid-user
</FilesMatch>

我在上面的代码中更改了网站的名称,并且我没有在.htaccess文件中包含所有规则,但我已经删除了其他内容而没有修复问题,所以我很确定我给了你所有相关的东西。如果你愿意,我可以私下发送实际文件和真实链接。

1 个答案:

答案 0 :(得分:2)

即使将站点移动到root后,在不访问wp-admin时获取密码提示的问题仍然存在!所以问题是它在停放的域名上。

在更新的InMotionHosting页面上找到解决方案:      http://www.inmotionhosting.com/support/website/wordpress/prevent-unauthorized-wp-admin-wp-login-php-attempts#allow-admin-ajax

解决方案是将以下规则添加到位于wp-admin目录中的.htaccess文件中:

# Allow plugin access to admin-ajax.php around password protection
<Files admin-ajax.php>
Order allow,deny
Allow from all
Satisfy any
</Files>

完整的.htaccess文件现在看起来像这样:

ErrorDocument 401 "Denied"
ErrorDocument 403 "Denied"

# Allow plugin access to admin-ajax.php around password protection
<Files admin-ajax.php>
Order allow,deny
Allow from all
Satisfy any
</Files>

AuthName "MySiteUser"
AuthUserFile "/home/my-site/.htpasswds/public_html/wp-admin/passwd"
AuthType Basic
require valid-user