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

Nginx代理Flask与Django应用时出现404错误的问题排查

问题解决思路与方案

一、先搞定Nginx的双斜杠问题

你的Nginx配置里的rewrite规则是双斜杠的罪魁祸首。原规则rewrite ^/v2(.*) /$1 break;在匹配/v2/admin时,$1会捕获到/admin,拼接后就变成了//admin。改一下规则和location的写法:

修改后的/v2 location块:

location /v2/ {
    rewrite ^/v2/(.*)$ /$1 break;
    proxy_pass http://127.0.0.1:8000/;  # 末尾必须加斜杠,保证路径拼接正确
    include /etc/nginx/proxy_params;
    proxy_redirect off;

    sub_filter 'href="/'  'href="/v2/';
    sub_filter_once off;
}
  • 把location改成/v2/(带末尾斜杠),避免和根路径的location冲突
  • rewrite规则精准匹配/v2/后面的内容,$1只会拿到admin而不是/admin,不会产生双斜杠
  • proxy_pass末尾加斜杠,Nginx会自动把rewrite后的路径拼到后端地址后面,最终传给Django的就是/admin

二、修正Django的反向代理配置

就算Nginx路径对了,Django可能因为反向代理的参数没配对,还是识别不了请求。修改settings.py:

# 必须把你的域名加到ALLOWED_HOSTS里,不然Django会直接拒绝请求
ALLOWED_HOSTS = ['my-subdomain.my-domain.com', '127.0.0.1']

# 开启这两个设置,让Django知道请求是通过HTTPS反向代理过来的
USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# 如果静态文件或者URL生成还有问题,可以加这个(Nginx配置对的话一般不需要)
# FORCE_SCRIPT_NAME = '/v2'

三、收尾操作

  1. 重启Nginx:sudo systemctl restart nginx
  2. 重启你的Django服务(比如用Gunicorn的话就重启Gunicorn)
  3. 再访问https://my-subdomain.my-domain.com/v2/admin试试,应该能正常加载了

内容的提问来源于stack exchange,提问作者Mihai-Andrei Neacsu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:26:40