如何使用Nginx阻止特定文件夹内文件的直接链接访问?
解决方案
你的现有配置存在两个核心问题:
- 第一个
location直接通过allow localhost; deny all;拦截了所有非本地请求,包括自身域名页面加载字幕的请求; - 两个正则
location都匹配.vtt文件,Nginx会优先执行先定义的规则,导致第二个location永远无法生效。
可以通过Nginx的valid_referers指令实现「允许自身域名加载、阻止直接链接访问」的需求,以下是修正后的配置:
location ~* \.(vtt|srt|txt)$ { # 配置合法的Referer来源: # - server_names:匹配当前server块中定义的域名 # - *.yourdomain.com/yourdomain.com:替换为你的实际域名(含带www和不带的情况) # - localhost/127.0.0.1:允许本地测试请求 # - blocked:允许被代理/防火墙修改过的Referer(部分合法请求会出现这种情况) valid_referers blocked server_names *.yourdomain.com yourdomain.com localhost 127.0.0.1; # 若Referer不合法(比如直接输入URL访问),返回403禁止访问 if ($invalid_referer) { return 403; } # 如果你需要将.vtt文件交由PHP处理,保留以下配置段;否则可删除 if ($uri ~* \.vtt$) { try_files $uri /index.php =404; fastcgi_split_path_info ^(.+\.vtt)(/.+)$; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; # 补充必要的FastCGI参数,确保PHP能正确处理请求 fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
关键说明
- 移除
none:valid_referers中不要加none,否则会允许无Referer的直接访问请求; - 替换域名:务必将
*.yourdomain.com和yourdomain.com替换为你实际使用的域名; - 配置验证:修改后执行
nginx -t检查配置语法,无误后执行nginx -s reload生效。
内容的提问来源于stack exchange,提问作者Stevan Mars
相关产品推荐
相关产品推荐

