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

Nginx未按是否含扩展名区分URL问题及配置求助

问题原因

你当前的配置中,无扩展名请求(如/post/153)会先匹配第二个正则~ ^.*$,执行rewrite后内部重定向到/post/153.webp,这个新URL会匹配第一个正则location~ \.[^/]+$,所以返回的响应头是该location的X-HAS-EXTENSION: true;同时如果静态文件不存在,第一个location未配置错误转发规则,无法触发API代理。

解决配置

替换为以下Nginx配置即可满足所有需求:

# 处理带扩展名的静态文件请求
location ~* \.[^/]+$ {
    add_header X-HAS-EXTENSION "true";
    root /PaydarSamane/Storage;
    # 若需要带扩展名的文件不存在时也转发到API,可取消注释以下两行
    # proxy_intercept_errors on;
    # error_page 404 = @api;
}

# 处理无扩展名的请求
location / {
    add_header X-HAS-EXTENSION "false";
    add_header X-ADDING-EXTENSION "true";
    root /PaydarSamane/Storage;
    default_type image/webp;
    proxy_intercept_errors on;
    # 优先尝试加载添加.webp后缀的静态文件,不存在则转发到API
    try_files $uri.webp @api;
}

location @api {
    # 移除.webp后缀,还原为原请求路径
    set $original_path $uri;
    if ($original_path ~ ^(.*)\.webp$) {
        set $original_path $1;
    }
    proxy_set_header Host $host;
    proxy_pass http://localhost:5200$original_path;
}
配置说明
  • 带扩展名请求:通过~* \.[^/]+$匹配所有含扩展名的URL,直接返回对应静态文件,响应头标记X-HAS-EXTENSION: true。
  • 无扩展名请求:进入location /后标记对应响应头,通过try_files先尝试加载.webp后缀的静态文件;文件存在则直接返回(保留当前location的响应头标记),不存在则转发到@api。
  • API转发:在@api中通过正则替换移除.webp后缀,将原请求路径转发到后端服务。

内容的提问来源于stack exchange,提问作者Ali Radan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:55:30