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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:12:49