Django生产环境URL末尾自动补‘/’失效,返回404问题排查
问题原因及解决方案
核心原因
生产环境下Django生成的重定向URL无效,导致浏览器无法正确跳转最终返回404,根源在于两处关键配置缺失:
Nginx未传递正确的请求头给Django
开发环境未配置server_name,Nginx默认将客户端请求的Host头直接转发给Django;但生产环境配置server_name后,Nginx会用自身的server_name作为Host头传递给Django,同时没有告知Django当前使用的是HTTPS协议。Django生成重定向URL时,会使用错误的Host(容器内部主机名)或HTTP协议,导致浏览器收到的重定向地址无法访问,表现为404。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
相关产品推荐
相关产品推荐

