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

Django生产环境URL末尾自动补‘/’失效,返回404问题排查

问题原因及解决方案

核心原因

生产环境下Django生成的重定向URL无效,导致浏览器无法正确跳转最终返回404,根源在于两处关键配置缺失:

  1. Nginx未传递正确的请求头给Django
    开发环境未配置server_name,Nginx默认将客户端请求的Host头直接转发给Django;但生产环境配置server_name后,Nginx会用自身的server_name作为Host头传递给Django,同时没有告知Django当前使用的是HTTPS协议。Django生成重定向URL时,会使用错误的Host(容器内部主机名)或HTTP协议,导致浏览器收到的重定向地址无法访问,表现为404。

  2. Django未启用反向代理相关配置
    未配置Django识别反向代理传递的协议和Host信息,导致生成的重定向URL不符合生产环境的域名和协议要求。

修复步骤

1. 修改生产环境Nginx配置

在location /块中添加请求头传递配置,确保Django能获取正确的外部请求信息:

upstream django {
    server django_gunicorn:8000;
}

server {
    listen 443 ssl;
    
    ssl_certificate /ssl/live/fullchain.pem;
    ssl_certificate_key /ssl/live/privkey.pem;
    
    server_name website.mydomain.com;
    
    location / {
        proxy_pass http://django;
        # 传递客户端真实Host
        proxy_set_header Host $host;
        # 传递真实协议(HTTPS)
        proxy_set_header X-Forwarded-Proto $scheme;
        # 传递客户端真实IP(可选但推荐)
        proxy_set_header X-Forwarded-For $remote_addr;
    }

    location /static/ {
        alias /static/;
    }
}

2. 修改Django项目的settings.py配置

启用反向代理相关参数,让Django信任Nginx传递的请求头:

# 允许的主机,添加生产环境域名
ALLOWED_HOSTS = ['website.mydomain.com']

# 启用反向代理Host识别
USE_X_FORWARDED_HOST = True

# 配置HTTPS协议识别
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

额外检查

确认Django的APPEND_SLASH配置为True(默认即为True,除非手动关闭过),这个参数是Django自动补全末尾/并重定向的核心开关。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:35:22