Nginx多字符串正则匹配Location及Rewrite规则失效求助
解决Nginx多前缀匹配Rewrite导致的404问题
你的问题出在Rewrite规则的捕获组引用错误上——当前规则里的/$1取的是第一个捕获组(也就是movie/series这类前缀字符串),而不是你需要保留的实际文件路径部分,这就导致Nginx试图去/storage/media/movie/2023/02/21/xxx.ts找文件,自然返回404。
正确的配置示例
直接修改Rewrite规则,把$1换成$2(对应第二个捕获组,也就是前缀后面的完整路径):
location ~ ^/(movie|series|video)/.*\.ts$ { root /storage/media; rewrite ^/(movie|series|video)/(.*)$ /$2 break; }
配置解释
- 正则
^/(movie|series|video)/.*\.ts$精准匹配所有以指定前缀开头的.ts请求 - Rewrite规则中,
$2对应第二个捕获组的内容:比如请求http://api.media.loc/movie/2023/02/21/video-1080-chunk_intro_300.ts,$2就是2023/02/21/video-1080-chunk_intro_300.ts - 结合
root /storage/media,最终实际访问的路径就是/storage/media/2023/02/21/video-1080-chunk_intro_300.ts,完全符合你的需求
进阶优化(前缀较多时)
如果后续需要添加更多前缀,单独维护正则会麻烦,可以用Nginx的map模块统一管理:
# 在http块中添加map配置 map $uri $stripped_path { ~^/(movie|series|video|anime|documentary)/(.*)$ $2; # 新增前缀直接在括号里追加即可 } # 然后在server块中配置location location ~ ^/(movie|series|video|anime|documentary)/.*\.ts$ { root /storage/media; rewrite ^ $stripped_path break; }
这样后续修改前缀只需要改动map里的规则,不用重复修改location的正则,更易维护。
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

