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; } }
生效步骤
- 执行
nginx -t校验配置是否合法 - 校验通过后执行
nginx -s reload重载Nginx配置即可生效
如果使用Kemal等Crystal Web框架,也可以直接在应用代码中配置根路径,一劳永逸:
Kemal.config.base_url = "/videos"
内容的提问来源于stack exchange,提问作者Mujtaba
相关产品推荐
相关产品推荐

