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

Nginx反向代理场景下如何处理应用层重定向丢失路径前缀问题

问题核心原因

你当前的配置存在3个错误导致重定向丢失/videos前缀:

  • 重复定义Host请求头,后面的proxy_set_header Host $host;覆盖了前面带路径的配置,且Host头本身不符合HTTP规范,只能存储域名/IP+端口,不能携带路径
  • 手动关闭了proxy_redirect,Nginx无法自动修正后端服务返回的重定向地址
  • 没有向后端传递正确的应用根路径信息,Crystal应用不知道需要在生成的URL前添加/videos前缀

修正后的配置

server {
    listen 80;
    server_name elearn.com.pk default_server localhost;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location /videos/ {
        proxy_pass http://0.0.0.0:3000/;
        proxy_http_version 1.1;
        rewrite /videos/(.*) /$1 break;

        # 自动修正后端返回的重定向地址,补充/videos前缀
        proxy_redirect http://0.0.0.0:3000/ /videos/;
        proxy_redirect / /videos/;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        # 传递应用根路径给Crystal框架,自动适配内部生成的URL前缀
        proxy_set_header X-Forwarded-Prefix /videos;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_cache_bypass $http_upgrade;
   }
}

生效步骤

  1. 执行nginx -t校验配置是否合法
  2. 校验通过后执行nginx -s reload重载Nginx配置即可生效

如果使用Kemal等Crystal Web框架,也可以直接在应用代码中配置根路径,一劳永逸:

Kemal.config.base_url = "/videos"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:54:05