You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress下通过.htaccess与PHP校验会话用户组保护文件访问问题

WordPress受保护目录访问控制解决方案

原方案问题根因

  1. 重定向循环本质是你使用readFile()请求了文件的HTTP地址,触发了Apache的重写规则,完全不需要通过Cookie逻辑解决。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:15:02