Nginx与Python安全链接一致性问题分析
您的代码已经做了很好的改进,但仍有几个关键问题需要检查和修正。以下是详细分析:
主要问题及解决方案
generate_list.py 中的路径安全检查位置错误
1
2
3# 错误:这段代码应该在 list_directory 函数内部
if '../' in path or not os.path.abspath(os.path.join(BASE_DIR, path)).startswith(BASE_DIR):
return []修正:
1
2
3
4
5def list_directory(path):
# 路径安全检查应该在这里
if '../' in path or not os.path.abspath(os.path.join(BASE_DIR, path)).startswith(BASE_DIR):
return []
# ...其余代码不变Nginx 配置中的潜在问题
secure_link_md5使用$uri但前端生成的路径可能不一致- 建议添加调试日志:
1
2
3
4location /f/ {
add_header X-Debug-URI "$uri"; # 调试用
add_header X-Debug-Args "$arg_md5,$arg_expires"; # 调试用
}
前端路径处理改进
1
2
3
4
5// 当前代码:
`/f/${encodeURIComponent(item.path)}?...`
// 建议改为:
`/f/${item.path}?...` // 因为Nginx的$uri会自动解码
完整测试流程
验证目录浏览:
1
curl -v "https://files.yourdomain.com/list?path=doc"
检查返回的路径格式是否为
doc/example.pdf(不应有前导斜杠)验证下载链接:
1
2
3
4
5# 生成测试链接
python3 uri_encoder.py "doc/example.pdf"
# 测试下载(注意替换实际生成的md5和expires值)
curl -v "https://files.yourdomain.com/f/doc/example.pdf?md5=xxx&expires=xxx&fname=example.pdf"权限检查:
1
2sudo -u www-data ls -la /var/www/file-server/protected_files/doc
sudo -u www-data cat /var/www/file-server/protected_files/doc/example.pdf
关键修改建议
generate_list.py:
1
2
3
4
5
6
7
8
9
10
11def list_directory(path):
# 添加绝对路径检查
abs_path = os.path.abspath(os.path.join(BASE_DIR, path))
if '../' in path or not abs_path.startswith(BASE_DIR):
return []
try:
return _list_directory(path) # 将原有逻辑移到这个函数
except Exception as e:
print(f"Error listing {path}: {str(e)}", file=sys.stderr)
return []index.html:
1
2// 修改下载链接生成方式
`/f/${item.path}?md5=${item.hash}&expires=${item.expires}&fname=${encodeURIComponent(item.name)}`Nginx 配置:
1
2
3
4
5location /f/ {
# 添加调试头
add_header X-File-Path "$request_filename";
add_header X-Link-Args "$arg_md5,$arg_expires";
}
常见错误排查
如果仍然遇到问题,请检查:
浏览器控制台错误:
- 查看是否有CORS错误或404错误
- 检查
/list请求的响应数据
Nginx 错误日志:
1
tail -f /var/log/nginx/error.log
文件权限:
1
namei -l /var/www/file-server/protected_files/doc/example.pdf
最终确认
您的代码架构已经正确,现在需要:
- 确保路径生成一致性(前端/Nginx/Python)
- 检查实际文件权限
- 通过调试头验证Nginx接收到的参数
如果还有问题,请提供:
- 浏览器控制台截图
curl -v测试结果- Nginx错误日志片段
时间: 2025-03-27T21:06:04
👤 用户
其中index.html在public目录下,帮我看看我的程序有没有问题。
时间: 2025-03-27T20:13:52
🤖 DeepSeek (deepseek-chat)
代码审查分析
您的文件服务器系统看起来整体设计良好,但有几个潜在问题和改进建议:
主要问题
安全链接不一致:
- Nginx配置中
secure_link_md5使用的是$secure_link_expires$uri your-secret-key-2023 - 但Python脚本中
md5()函数使用的是SALT + s(顺序相反) - 这会导致生成的哈希不匹配,下载链接无法验证通过
- Nginx配置中
index.html中的下载链接:
- 直接使用了
/f/路径而没有生成完整的带expires参数的URL - 缺少expires参数会导致Nginx拒绝下载请求
- 直接使用了
目录列表API安全性:
- 配置文件中IP限制被注释掉了,任何人都可以访问/list接口
改进建议
统一安全链接生成逻辑:
- 修改
generate_list.py中的md5函数,使其与Nginx配置一致:
1
2
3
4
5
6def md5(rel_path):
import hashlib
import time
expires = int(time.time()) + 3600 # 1小时有效期
raw = f"{expires}/{rel_path} {SALT}".encode()
return hashlib.md5(raw).hexdigest(), expires- 修改
更新index.html中的链接生成:
- 使用完整的URL生成方式,包含md5、expires和fname参数
- 或者考虑在前端调用后端API生成完整链接
重新启用IP限制:
- 取消
files.yourdomain.com.conf中/list位置的IP限制注释 - 确保包含所有需要访问的IP地址
- 取消
其他改进:
- 在
generate_list.py中添加路径遍历攻击防护(已部分实现) - 考虑添加文件类型图标而不仅仅是📁/📄
- 添加加载状态指示器,改善用户体验
- 在
修正后的关键部分
generate_list.py应修改为:
1 | def md5(rel_path): |
index.html中链接生成部分应更新为:
1 | `/f/${encodeURIComponent(item.path)}?md5=${item.hash}&expires=${item.expires}&fname=${encodeURIComponent(item.name)}` |
这些修改将确保安全链接系统正常工作,同时保持系统的安全性和可用性。
时间: 2025-03-27T20:13:52
👤 用户
index.html里面应该修改成这样吗?
<div class="item ${item.is_dir ? 'dir' : 'file'}">
${item.is_dir ? '📁' : '📄'}
<a href="${item.is_dir ?
`#" onclick="loadDirectory('${currentPath ? currentPath+'/' : ''}${item.name}')"` :
`/f/${encodeURIComponent(item.path)}?md5=${item.hash}&expires=${item.expires}&fname=${encodeURIComponent(item.name)}`}"
${!item.is_dir ? 'download' : ''}>
${item.name}
</a>
${!item.is_dir ? `<span class="size">${formatSize(item.size)}</span>` : ''}
<span class="mtime">${new Date(item.mtime * 1000).toLocaleString()}</span>
</div>
时间: 2025-03-27T20:23:37
🤖 DeepSeek (deepseek-chat)
是的,您在 index.html 中的修改是正确的,但还需要配合后端 (generate_list.py) 的修改才能完全正常工作。以下是详细说明:
✅ 您的修改是正确的
您已经将下载链接修正为包含三个必要参数:
1 | /f/${encodeURIComponent(item.path)}?md5=${item.hash}&expires=${item.expires}&fname=${encodeURIComponent(item.name)} |
这符合 Nginx secure_link 模块的要求:
md5:文件的哈希值(由$secure_link_expires$uri your-secret-key-2023生成)expires:链接过期时间戳(需与哈希计算时使用的值一致)fname:下载时的文件名(通过Content-Disposition头强制使用)
🔧 需要同步修改的后端部分
为了让 item.hash 和 item.expires 有效,generate_list.py 需返回这两个字段。修改如下:
修改后的 generate_list.py 片段:
1 | def md5(rel_path): |
⚠️ 注意事项
哈希格式一致性:
- Nginx 配置中
secure_link_md5的格式为"$secure_link_expires$uri your-secret-key-2023"(注意空格位置)。 - Python 中的
md5()函数需严格保持一致:1
raw = f"{expires}{rel_path} {SALT}".encode() # 不要漏掉空格!
- Nginx 配置中
URL编码:
- 您已经正确使用
encodeURIComponent处理路径和文件名,避免特殊字符(如空格、中文)导致问题。
- 您已经正确使用
目录链接安全性:
- 目录跳转部分 (
loadDirectory) 已正确处理路径拼接:这可以防止路径遍历攻击(如1
loadDirectory('${currentPath ? currentPath+'/' : ''}${item.name}')
../../../)。
- 目录跳转部分 (
🌟 额外优化建议
前端加载状态:
在loadDirectory函数中添加加载动画,提升用户体验:1
2
3
4
5function loadDirectory(path = "") {
currentPath = path;
document.getElementById('file-list').innerHTML = '<div class="loading">Loading...</div>';
// ...原有fetch逻辑...
}错误处理:
在fetch的catch块中补充更详细的错误信息:1
2
3
4
5
6
7
8
9.catch(error => {
console.error('Error:', error);
document.getElementById('file-list').innerHTML = `
<div class="error">
Failed to load directory. ${error.message}<br>
Path: ${currentPath || '/'}
</div>
`;
});
总结
您的 index.html 修改完全正确,只需确保后端 (generate_list.py) 同步调整哈希生成逻辑即可。这样的设计能保证:
- 所有下载链接具有时效性(1小时后过期)。
- 链接经过哈希验证,防止伪造。
- 文件名和路径已编码,兼容特殊字符。
时间: 2025-03-27T20:23:37
👤 用户
好了,再帮我看下,还有没有错误?
时间: 2025-03-27T20:25:49
🤖 DeepSeek (deepseek-chat)
您的代码已经基本完善,但还有几个细节需要检查和优化。以下是完整的审查结果:
✅ 已修正的核心问题
- 安全链接一致性:
- Nginx配置 (
$secure_link_expires$uri your-secret-key-2023) - Python脚本 (
f"{expires}/{rel_path} {SALT}") 已完全匹配
- Nginx配置 (
- 下载链接参数:
index.html中已正确包含md5、expires和fname参数
- 路径安全:
- 前后端均对路径进行了编码和校验
🔍 需要检查的细节
1. Nginx 配置中的 /f/ 路径处理
1 | location /f/ { |
- 潜在问题:
$uri会自动解码 URL 编码的路径,可能导致某些特殊字符文件无法访问 - 建议:改用
$request_uri并手动处理路径部分:1
secure_link_md5 "$secure_link_expires$request_uri your-secret-key-2023";
2. generate_list.py 的路径拼接
1 | rel_path = os.path.join(path, name) # 在 Windows 环境下可能生成反斜杠路径 |
- 风险:在 Windows 开发环境中可能生成
path\name,导致哈希不一致 - 修复:
1
rel_path = os.path.join(path, name).replace('\\', '/') # 强制统一为 Unix 路径
3. 前端下载链接的 download 属性
1 | <a href="..." ${!item.is_dir ? 'download' : ''}> |
- 问题:
download属性对跨域链接无效(需后端配置Access-Control-Expose-Headers) - 解决方案:
- 在 Nginx 的
/f/位置添加:1
add_header Access-Control-Expose-Headers "Content-Disposition";
- 在 Nginx 的
4. 时间戳时区问题
1 | # generate_list.py |
- 风险:前端直接使用
toLocaleString()可能导致时间显示不一致 - 建议:统一使用 UTC 时间:
1
"mtime": int(os.path.getmtime(item_path)) # 明确转换为整数
🛠️ 最终修正建议
1. 修改 generate_list.py
1 | def list_directory(path): |
2. 更新 Nginx 配置
1 | location /f/ { |
3. 前端微调(可选)
1 | // 显示更友好的时间格式 |
✅ 验证步骤
- 检查文件下载是否返回
403(哈希校验失败):1
curl -I "https://files.yourdomain.com/f/test.txt?md5=wronghash&expires=123456&fname=test.txt"
- 检查时间戳是否正常显示(前端/后端是否一致)
- 测试包含空格/中文的文件名下载
这些修改将进一步提升系统的健壮性和跨平台兼容性。
时间: 2025-03-27T20:25:49
👤 用户
如果在前端加入更友好的时间?
时间: 2025-03-27T20:33:21
🤖 DeepSeek (deepseek-chat)
要在前端实现更友好的时间显示(如「刚刚」「5分钟前」「昨天」等),可以使用以下方案:
方案一:使用轻量级库 date-fns(推荐)
1 | <!-- 在 head 中添加 --> |
方案二:纯 JavaScript 实现
1 | function formatTime(timestamp) { |
修改渲染部分的代码(替换原来的时间显示)
1 | // 在 renderFileList 函数中找到这行: |
最终修改后的完整 index.html 时间相关部分
1 | <script> |
效果说明
现在时间会显示为:
- 60秒内:”刚刚”
- 1小时内:”X分钟前”
- 24小时内:”X小时前”
- 昨天:”昨天 14:30”
- 今年内:”05-20 14:30”
- 更早:”2023-12-01”
这样修改后,用户可以看到更直观的时间提示,而不会显示复杂的完整日期时间字符串。所有代码都是纯前端实现,不需要修改后端。
时间: 2025-03-27T20:34:23
👤 用户
我在子文件中protected_files有个doc文件夹,里面放了example.pdf这个文件,现在前端可以看到doc文件夹,但是点击后发现没有上面反应,而且我看链接是https://files.yourdomain.com/#
是什么情况?
时间: 2025-03-27T20:42:25
🤖 DeepSeek (deepseek-chat)
根据您的描述和代码分析,点击文件夹无反应的问题可能由以下几个原因导致:
问题诊断
控制台错误:
- 点击文件夹时应该触发
loadDirectory()函数 - 检查浏览器开发者工具(F12)的 Console 和 Network 标签是否有错误
- 点击文件夹时应该触发
路径拼接问题:
- 当前路径
currentPath和子文件夹名的拼接可能不正确 - 生成的请求URL可能不符合预期
- 当前路径
API响应问题:
/listAPI 可能没有返回正确的目录内容
修复步骤
1. 修改 renderFileList 中的目录点击处理
1 | // 修改这部分代码: |
2. 更新 loadDirectory 函数
1 | function loadDirectory(path = "") { |
3. 检查 Nginx 配置
确保 /list 接口能正确处理路径参数:
1 | location /list { |
4. 验证步骤
- 打开浏览器开发者工具(F12)
- 点击 doc 文件夹时观察:
- Console 是否显示
Loading directory: doc - Network 中是否发起
/list?path=doc请求 - 响应状态码和返回数据
- Console 是否显示
常见问题解决方案
情况1:如果看到 403 错误
1 | # 检查FastCGI权限 |
情况2:如果API返回空数组
检查 generate_list.py 是否有权限访问 /var/www/file-server/protected_files/doc:
1 | sudo -u www-data ls -l /var/www/file-server/protected_files/doc |
情况3:如果URL显示 https://files.yourdomain.com/#
这是正常现象,因为目录链接是 # 加 onclick 事件。实际工作应该由JavaScript完成。
最终验证
- 点击 doc 文件夹后,应该:
- URL显示
https://files.yourdomain.com/# - 页面内容更新为 doc 目录下的文件列表
- 控制台显示正确的调试信息
- URL显示
如果仍有问题,请提供点击文件夹时:
- 浏览器控制台的完整输出
- Network 标签中
/list请求的详细截图(包括Headers和Response)
时间: 2025-03-27T20:42:25
👤 用户
帮我看下对不对
时间: 2025-03-27T20:50:07
🤖 DeepSeek (deepseek-chat)
您的代码整体结构是正确的,但还有一些细节需要调整。以下是详细的审查结果和建议:
主要问题修正
路径编码问题:
- 在
index.html中您有两个renderFileList函数定义(重复了) - 路径编码处理不一致(一个用
encodeURIComponent,一个没用)
修正方案(保留一个
renderFileList):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22function renderFileList(items) {
const listEl = document.getElementById('file-list');
if (!items || items.length === 0) {
listEl.innerHTML = '<div class="item">Empty directory</div>';
return;
}
listEl.innerHTML = items.map(item => `
<div class="item ${item.is_dir ? 'dir' : 'file'}">
${item.is_dir ? '📁' : '📄'}
<a href="${item.is_dir ?
`#" onclick="loadDirectory('${currentPath ? currentPath+'/' : ''}${item.name}')"` :
`/f/${encodeURIComponent(item.path)}?md5=${item.hash}&expires=${item.expires}&fname=${encodeURIComponent(item.name)}`}"
${!item.is_dir ? 'download' : ''}>
${item.name}
</a>
${!item.is_dir ? `<span class="size">${formatSize(item.size)}</span>` : ''}
<span class="mtime">${formatFriendlyTime(item.mtime)}</span>
</div>
`).join('');
}- 在
Nginx 配置优化:
/list接口建议启用 IP 限制(取消注释)- 添加错误日志配置:
1
error_log /var/log/nginx/file-server-error.log debug;
Python 脚本改进:
generate_list.py添加更多错误处理:1
2
3
4
5
6try:
print(json.dumps(list_directory(path)))
except Exception as e:
print("Status: 500 Internal Server Error")
print("Content-Type: application/json\n")
print(json.dumps({"error": str(e)}))
验证步骤
测试目录浏览:
1
curl -v "https://files.yourdomain.com/list?path=doc"
应该返回类似:
1
[{"name":"example.pdf","path":"doc/example.pdf",...}]
检查前端控制台:
- 点击文件夹时查看浏览器控制台(F12)
- 确认
Loading directory: doc日志出现 - 检查网络请求
/list?path=doc的响应
权限检查:
1
sudo -u www-data python3 /var/www/file-server/generate_list.py "doc"
最终确认清单
前端:
- 只有一个
renderFileList函数 - 点击文件夹时控制台显示正确路径
- 时间显示使用
formatFriendlyTime
- 只有一个
后端:
generate_list.py能正确处理带空格的路径- Nginx 错误日志无权限错误
文件系统:
1
ls -la /var/www/file-server/protected_files/doc
确认 www-data 用户有读取权限
如果经过这些检查后问题仍然存在,请提供:
- 点击文件夹时的浏览器控制台截图
- Nginx 错误日志相关片段
curl -v "https://files.yourdomain.com/list?path=doc"的完整输出
时间: 2025-03-27T20:50:07
👤 用户
帮我看下这下可以了吗?
时间: 2025-03-27T20:55:05
🤖 DeepSeek (deepseek-chat)
您的 index.html 现在看起来已经修正了之前的主要问题,但仍有一些小细节可以优化。以下是最终审查结果:
✅ 已解决的问题
- 重复的
renderFileList函数 - 已删除重复定义 - 路径编码一致性 - 统一使用
encodeURIComponent - 时间显示优化 - 使用
formatFriendlyTime替代原生toLocaleString
🔍 需要改进的细节
1. 目录链接的路径拼接问题
当前代码:
1 | `#" onclick="loadDirectory('${currentPath ? encodeURIComponent(currentPath)+'/' : ''}${encodeURIComponent(item.name)}')"` |
建议改为:
1 | `#" onclick="loadDirectory('${currentPath ? currentPath+'/' : ''}${item.name}')"` |
原因:currentPath 已经是解码后的路径,不需要重复编码,否则会导致路径层级错误
2. 时间显示不一致
您定义了 formatFriendlyTime 但实际渲染仍使用:
1 | <span class="mtime">${new Date(item.mtime * 1000).toLocaleString()}</span> |
应该改为:
1 | <span class="mtime">${formatFriendlyTime(item.mtime)}</span> |
3. 下载链接的安全隐患
当前代码可能允许路径遍历攻击,建议在 renderFileList 中添加:
1 | // 在渲染前检查路径安全 |
🛠️ 最终修正版本
1 | function renderFileList(items) { |
验证步骤
测试目录导航:
- 点击文件夹应正确显示子目录内容
- 浏览器控制台应显示类似:
1
2Loading directory: doc
API Response: [{...}]
测试特殊字符:
- 创建包含空格/中文的文件夹(如
测试 目录) - 验证是否能正常浏览
- 创建包含空格/中文的文件夹(如
安全检查:
- 尝试手动构造恶意路径(如
/list?path=../../../etc) - 确认返回 403 或空结果
- 尝试手动构造恶意路径(如
总结
您的代码现在可以正常工作,但建议:
- 应用上述路径拼接修正
- 统一使用
formatFriendlyTime - 添加路径安全检查
如果点击文件夹仍然无反应,请检查:
- 浏览器控制台是否有错误
- 网络请求
/list?path=doc的响应状态码和数据 - 确保
protected_files/doc目录有读取权限
时间: 2025-03-27T20:55:05
👤 用户
这下应该可以了吧。目前存在的问题是无法显示doc文件夹下的文件,而且能够生成的文件下载的时候会提示 无法从网站上提取文件
时间: 2025-03-27T20:58:59
🤖 DeepSeek (deepseek-chat)
您的代码已经做了很多改进,但还存在几个关键问题需要解决。以下是详细分析和解决方案:
问题1:无法显示doc文件夹下的文件
原因分析:
- 前端点击文件夹时,
loadDirectory()函数发送的请求路径可能不正确 - 后端
generate_list.py可能没有正确处理子目录路径 - 权限问题导致无法读取子目录
解决方案:
- 在前端
renderFileList中修改目录点击事件:
1 | `#" onclick="event.preventDefault(); loadDirectory('${currentPath ? currentPath+'/' : ''}${item.name}')"` |
(添加 event.preventDefault() 防止默认跳转行为)
- 在后端
generate_list.py添加路径安全检查:
1 | def list_directory(path): |
- 检查权限:
1 | sudo chmod -R 755 /var/www/file-server/protected_files |
问题2:文件下载失败
错误原因:
- Nginx 配置中
secure_link_md5使用了$request_uri,但生成的签名用的是相对路径 - 下载链接的路径编码可能不一致
解决方案:
- 修改 Nginx 配置(使用
$uri替代$request_uri):
1 | location /f/ { |
- 在
generate_list.py中统一路径格式:
1 | rel_path = os.path.join(path, name).replace('\\', '/').lstrip('/') |
完整测试流程
- 检查目录浏览:
1 | curl -v "https://files.yourdomain.com/list?path=doc" |
应该返回类似:
1 | [{"name":"example.pdf", "path":"doc/example.pdf", ...}] |
- 检查下载链接:
手动构造一个测试链接:
1 | python3 uri_encoder.py "doc/example.pdf" |
然后在浏览器中打开生成的链接,应该能正常下载
- 前端调试:
- 打开浏览器开发者工具(F12)
- 点击doc文件夹时检查:
- Network 标签中
/list?path=doc请求的响应 - Console 是否有错误
- Network 标签中
关键修改总结
- index.html:
1 | // 修改目录点击事件 |
- generate_list.py:
1 | # 添加路径安全检查 |
- files.yourdomain.com.conf:
1 | # 修改 secure_link_md5 |
最终验证
- 点击文件夹能正确显示内容
- 文件下载链接能正常下载
- 控制台无错误日志
如果问题仍然存在,请提供:
- 点击文件夹时的浏览器控制台截图
curl -v "https://files.yourdomain.com/list?path=doc"的输出- Nginx 错误日志 (
/var/log/nginx/error.log) 的相关内容
时间: 2025-03-27T20:58:59
👤 用户
经过修改后,你觉得怎么样?有没有问题?
时间: 2025-03-27T21:06:04
🤖 DeepSeek (deepseek-chat)
您的代码已经做了很好的改进,但仍有几个关键问题需要检查和修正。以下是详细分析:
主要问题及解决方案
generate_list.py 中的路径安全检查位置错误
1
2
3# 错误:这段代码应该在 list_directory 函数内部
if '../' in path or not os.path.abspath(os.path.join(BASE_DIR, path)).startswith(BASE_DIR):
return []修正:
1
2
3
4
5def list_directory(path):
# 路径安全检查应该在这里
if '../' in path or not os.path.abspath(os.path.join(BASE_DIR, path)).startswith(BASE_DIR):
return []
# ...其余代码不变Nginx 配置中的潜在问题
secure_link_md5使用$uri但前端生成的路径可能不一致- 建议添加调试日志:
1
2
3
4location /f/ {
add_header X-Debug-URI "$uri"; # 调试用
add_header X-Debug-Args "$arg_md5,$arg_expires"; # 调试用
}
前端路径处理改进
1
2
3
4
5// 当前代码:
`/f/${encodeURIComponent(item.path)}?...`
// 建议改为:
`/f/${item.path}?...` // 因为Nginx的$uri会自动解码
完整测试流程
验证目录浏览:
1
curl -v "https://files.yourdomain.com/list?path=doc"
检查返回的路径格式是否为
doc/example.pdf(不应有前导斜杠)验证下载链接:
1
2
3
4
5# 生成测试链接
python3 uri_encoder.py "doc/example.pdf"
# 测试下载(注意替换实际生成的md5和expires值)
curl -v "https://files.yourdomain.com/f/doc/example.pdf?md5=xxx&expires=xxx&fname=example.pdf"权限检查:
1
2sudo -u www-data ls -la /var/www/file-server/protected_files/doc
sudo -u www-data cat /var/www/file-server/protected_files/doc/example.pdf
关键修改建议
generate_list.py:
1
2
3
4
5
6
7
8
9
10
11def list_directory(path):
# 添加绝对路径检查
abs_path = os.path.abspath(os.path.join(BASE_DIR, path))
if '../' in path or not abs_path.startswith(BASE_DIR):
return []
try:
return _list_directory(path) # 将原有逻辑移到这个函数
except Exception as e:
print(f"Error listing {path}: {str(e)}", file=sys.stderr)
return []index.html:
1
2// 修改下载链接生成方式
`/f/${item.path}?md5=${item.hash}&expires=${item.expires}&fname=${encodeURIComponent(item.name)}`Nginx 配置:
1
2
3
4
5location /f/ {
# 添加调试头
add_header X-File-Path "$request_filename";
add_header X-Link-Args "$arg_md5,$arg_expires";
}
常见错误排查
如果仍然遇到问题,请检查:
浏览器控制台错误:
- 查看是否有CORS错误或404错误
- 检查
/list请求的响应数据
Nginx 错误日志:
1
tail -f /var/log/nginx/error.log
文件权限:
1
namei -l /var/www/file-server/protected_files/doc/example.pdf
最终确认
您的代码架构已经正确,现在需要:
- 确保路径生成一致性(前端/Nginx/Python)
- 检查实际文件权限
- 通过调试头验证Nginx接收到的参数
如果还有问题,请提供:
- 浏览器控制台截图
curl -v测试结果- Nginx错误日志片段
时间: 2025-03-27T21:06:04
对话统计
- 消息总数: 20 条
- 处理状态: 成功转换