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

Django Admin通过Kubernetes Ingress访问出现403错误求助

排查思路

1. 检查Django的ALLOWED_HOSTS配置

确保api.example.com已添加到Django的ALLOWED_HOSTS设置中。直接访问Pod时请求的Host是Pod内部IP或域名,而通过Ingress访问时Host为api.example.com,若不在ALLOWED_HOSTS列表内,Django会直接返回403。

2. 配置Django识别HTTPS请求

Ingress终止HTTPS后,转发给Django的是HTTP请求,若Django无法识别原始请求为HTTPS,Admin页面的CSRF验证会失败导致403:

  • 在Django配置中添加:
    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
    
  • 生产环境建议开启:
    SESSION_COOKIE_SECURE = True
    CSRF_COOKIE_SECURE = True
    

3. 验证CSRF_TRUSTED_ORIGINS设置

Django 3.2及以上版本需要将api.example.com加入CSRF_TRUSTED_ORIGINS,否则HTTPS下的CSRF请求会被拒绝:

CSRF_TRUSTED_ORIGINS = ['https://api.example.com']

4. 检查Ingress的请求头传递

确认Nginx Ingress正确转发必要请求头,可在Ingress的annotations中补充配置:

nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "true"

当前Ingress的path: "/"和pathType: Prefix配置正确,不会截断请求路径。

5. 查看日志定位具体原因

  • 查看Nginx Ingress Controller日志,确认请求是否正确转发到backend服务:
    kubectl logs -n ingress-nginx <ingress-controller-pod-name>
    
  • 查看Django Pod日志,获取403错误的具体触发原因(如ALLOWED_HOSTS校验失败、CSRF验证失败等):
    kubectl logs <django-pod-name>
    

6. 验证Ingress与服务连通性

  • 检查Ingress配置是否生效:
    kubectl get ingress backend-ingress
    kubectl describe ingress backend-ingress
    
  • 验证backend服务的内部连通性,确认服务本身能正常响应Admin请求:
    kubectl run -it --rm --image=curlimages/curl curl-test -- curl http://backend:8000/admin
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:45:13