htaccess保护Gravity Forms上传目录失效:文件未被拦截求助
我编写了以下.htaccess代码,目的是限制未登录用户访问uploads文件夹中的Gravity Forms目录及其内容:
<IfModule mod_rewrite.c> RewriteEngine On # 确保wp-login.php请求不被重定向 RewriteCond %{REQUEST_URI} ^/wp-login.php$ [NC] RewriteRule .* - [L] # 确保wp-admin请求不被重定向 RewriteCond %{REQUEST_URI} ^/wp-admin$ [NC] RewriteRule .* - [L] # 检查请求是否在gravity_forms目录内 RewriteCond %{REQUEST_URI} ^/wp-content/uploads/gravity_forms/ [NC] # 检查用户是否未登录 RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in.*$ [NC] # 未登录则重定向到登录页 RewriteRule ^(.*)$ /wp-login.php [R=302,L] </IfModule>
但规则未完全生效:访问Gravity Forms目录下的文件链接(如/wp-content/uploads/gravity_forms/2-8ae1e63a5d3ff208ec0cafb57fd3d365/2023/10/nung-854230.pdf?gv-iframe=true)时,游客不会被跳转到登录页;但访问目录链接(如/wp-content/uploads/gravity_forms/2-8ae1e63a5d3ff208ec0cafb57fd3d365/2023/10/)时,能正常跳转。显然文件访问没被拦截,请问问题出在哪里?
核心原因是Apache默认会直接处理静态文件请求(如PDF、图片等),不会触发mod_rewrite规则,除非对目标目录配置了足够权限让rewrite规则生效,或者规则本身明确针对文件请求做处理。
访问目录链接时,Apache找不到默认索引文件(如index.php),会触发目录列表请求,此时会走mod_rewrite规则;但访问具体静态文件时,Apache直接返回文件内容,跳过了rewrite规则的执行。
方法1:确保目录的Apache权限配置正确
在你的Apache站点配置(或httpd.conf)中,针对/wp-content/uploads/gravity_forms/目录设置AllowOverride FileInfo或AllowOverride All,确保mod_rewrite规则能作用于静态文件:
<Directory "/path/to/your/wp-content/uploads/gravity_forms"> AllowOverride FileInfo </Directory>
修改后重启Apache服务。
方法2:调整.htaccess规则,强制静态文件走rewrite
在原规则中添加条件,明确针对存在的文件和目录生效,同时优化匹配逻辑:
<IfModule mod_rewrite.c> RewriteEngine On # 确保wp-login.php请求不被重定向 RewriteCond %{REQUEST_URI} ^/wp-login.php$ [NC] RewriteRule .* - [L] # 确保wp-admin请求不被重定向 RewriteCond %{REQUEST_URI} ^/wp-admin$ [NC] RewriteRule .* - [L] # 检查请求路径包含gravity_forms目录 RewriteCond %{REQUEST_URI} /gravity_forms/ [NC] # 检查请求的是存在的文件或目录 RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d # 检查用户未登录 RewriteCond %{HTTP_COOKIE} !wordpress_logged_in [NC] # 重定向到登录页,登录后自动返回原请求页面 RewriteRule ^ /wp-login.php?redirect_to=%{REQUEST_URI} [R=302,L] </IfModule>
关键调整说明:
- 将
REQUEST_URI的匹配逻辑改为检查路径包含gravity_forms/,更灵活覆盖所有相关请求 - 添加
%{REQUEST_FILENAME} -f [OR] %{REQUEST_FILENAME} -d,明确对存在的文件和目录生效 - 重定向URL中加入
redirect_to=%{REQUEST_URI},用户登录后自动跳回原请求页面,提升体验
内容的提问来源于stack exchange,提问作者Ashtheslayer

