Django应用部署Nginx反向代理后重定向路径错误修复
问题描述
我有一个Django应用,views.py中包含以下视图函数:
def load_form(request): if request.method == 'POST': newQAForm = QAForm(request.POST) if newQAForm.is_valid(): instance = newQAForm.save(commit=False) instance.save(using='RadDataWarehouse') return redirect('confirmation')
以及
def confirmation(request): return render(request, 'confirmation.html')
本地运行时,表单提交后会正常重定向至http://127.0.0.1:8000/confirmation/;部署到Linux服务器并配置Nginx反向代理(配置如下)后,表单提交后重定向至https://abcdomain.com/confirmation/,而非预期的https://abcdomain.com/protocolqa/confirmation/,如何解决该问题?
Nginx配置片段:
location /protocolqa/ { proxy_pass http://localhost:8511/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Script-Name /protocolqa; proxy_set_header X-Original-URI $request_uri; }
解决方法
1. 配置Django识别反向代理前缀
Django需要获取请求的前缀路径(/protocolqa)才能生成正确的重定向URL,在项目的settings.py中添加以下配置:
# 允许访问的域名 ALLOWED_HOSTS = ['abcdomain.com'] # 启用反向代理头部支持 USE_X_FORWARDED_HOST = True # 识别HTTPS的转发头部 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 设置全局脚本路径前缀 FORCE_SCRIPT_NAME = '/protocolqa'
2. 确认URL路由配置无硬编码
检查项目根目录或应用的urls.py,确保confirmation视图的路由是相对路径,没有硬编码根路径:
from django.urls import path from . import views urlpatterns = [ path('confirmation/', views.confirmation, name='confirmation'), # 其他路由配置... ]
3. 验证Nginx配置有效性
当前Nginx配置中已正确设置X-Script-Name /protocolqa,且proxy_pass末尾的斜杠能正确转发路径,无需修改。如果后续出现路径转发异常,可检查proxy_pass是否保留了正确的路径结构。
4. 重启服务生效
修改配置后,重启Django应用(以gunicorn为例)和Nginx服务:
sudo systemctl restart gunicorn sudo systemctl restart nginx
内容的提问来源于stack exchange,提问作者Ag Long
相关产品推荐
相关产品推荐

