如何用htaccess保护WordPress安装目录下的非WP子目录?
嘿,我来帮你搞定这个问题!首先明确说:完全可以在子目录里单独放一个.htaccess文件,不用非得修改WordPress根目录的那个。你遇到的500错误大概率是语法错误、路径问题或者和根目录规则冲突导致的,下面一步步给你排查和解决:
一、先排查子目录.htaccess的常见错误
最容易踩坑的就是这几个点:
AuthUserFile路径错误
很多人会用相对路径(比如./.htpasswd),但Apache在解析.htaccess时,路径是相对于服务器根目录的,不是你的子目录。你必须写绝对路径,比如你的子目录是/root/website/subpage/,那正确的写法应该是:AuthType Basic AuthName "请输入登录信息" AuthUserFile /root/website/subpage/.htpasswd Require valid-user不确定绝对路径的话,SSH到服务器进入subpage目录,执行
pwd命令就能拿到准确路径。文件权限问题
.htpasswd和子目录的.htaccess权限不能太开放,否则Apache会拒绝读取。建议设置:- .htaccess:
chmod 644 /root/website/subpage/.htaccess - .htpasswd:
chmod 644 /root/website/subpage/.htpasswd
(如果服务器安全设置严格,也可以用600,只要Apache用户能读取就行)
- .htaccess:
语法错误
检查.htaccess里的指令有没有拼写错误,比如把AuthType写成AuthTyp,或者少了分号,这种小错误都会触发500错误。
二、解决WordPress根目录规则的冲突
如果子目录的.htaccess没问题,但还是报错,可能是WordPress根目录的重写规则把subpage的请求拦截了。WordPress默认的.htaccess会把所有不存在的文件/目录请求导向index.php,这时候你需要在根目录的.htaccess里加一条排除规则:
打开根目录的.htaccess,在RewriteRule部分修改成这样:
RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] # 新增:排除subpage目录,不应用WordPress的重写规则 RewriteCond %{REQUEST_URI} !^/subpage/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]
这样WordPress的重写就不会影响subpage的访问了。
三、终极排查:看Apache错误日志
如果上面的方法都没用,直接去看Apache的错误日志,里面会有具体的错误原因,比如“AuthUserFile not found”或者“Invalid command 'AuthTyp'”。日志路径一般是:
- Debian/Ubuntu:
/var/log/apache2/error.log - CentOS/RHEL:
/var/log/httpd/error.log
执行tail -f /var/log/apache2/error.log(对应你的路径),然后刷新subpage页面,就能看到实时的错误信息,顺着改就行。
总结一下:子目录用独立的.htaccess是完全可行的,重点要注意绝对路径、权限和避免根目录规则的干扰,按照上面的步骤排查,应该能解决500错误。
内容的提问来源于stack exchange,提问作者t3ax

