WordPress下通过.htaccess与PHP校验会话用户组保护文件访问问题
WordPress受保护目录访问控制解决方案
原方案问题根因
- 重定向循环本质是你使用
readFile()请求了文件的HTTP地址,触发了Apache的重写规则,完全不需要通过Cookie逻辑解决。 - Cookie方案本身存在伪造风险,且301永久重定向会被浏览器缓存,导致Cookie删除逻辑无法生效。
最优实现方案
步骤1:调整.htaccess配置
直接在你要保护的目录wp-content/uploads/folder_to_protect/下新建.htaccess文件,规则如下,不需要外部跳转,所有请求内部重写到校验脚本:
<IfModule mod_rewrite.c> RewriteEngine On # 所有请求内部转发给checkUser.php处理,不触发外部跳转 RewriteRule ^(.*)$ /checkUser.php?req_file=$1 [L,QSA] </IfModule> # 禁止直接访问.htaccess文件 <Files ".htaccess"> Require all denied </Files>
步骤2:编写checkUser.php校验逻辑
<?php // 加载WordPress核心,获取用户会话信息 require_once $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php'; // 配置项:允许访问的用户组、受保护目录的本地绝对路径 $allow_roles = ['administrator', 'editor']; $protect_dir = $_SERVER['DOCUMENT_ROOT'] . '/wp-content/uploads/folder_to_protect/'; // 1. 校验用户登录状态 if (!is_user_logged_in()) { http_response_code(403); exit('无权访问'); } // 2. 校验用户组 $user = wp_get_current_user(); $user_roles = $user->roles; if (!array_intersect($user_roles, $allow_roles)) { http_response_code(403); exit('无权访问'); } // 3. 校验文件路径,防止路径遍历漏洞 $req_file = sanitize_text_field($_GET['req_file']); $real_file = realpath($protect_dir . $req_file); if (!$real_file || strpos($real_file, $protect_dir) !== 0 || !is_file($real_file)) { http_response_code(404); exit('文件不存在'); } // 4. 输出文件 $mime_type = mime_content_type($real_file); header('Content-Type: ' . $mime_type); header('Content-Length: ' . filesize($real_file)); // 可选添加缓存头 header('Cache-Control: private, max-age=86400'); readfile($real_file); exit;
性能优化建议
如果站点有大文件需要输出,建议安装Apache的mod_xsendfile模块,替换readfile逻辑为header('X-Sendfile: ' . $real_file);,可以大幅降低PHP进程资源占用,提升下载速度。
内容的提问来源于stack exchange,提问作者Dosenbrot
相关产品推荐
相关产品推荐

