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
相关产品推荐
相关产品推荐

