我正在運行一個簡單的 Django 應用程式,沒有任何復雜的設定(大部分是默認的,Django allauth 和 Django Rest Framework)。
本地和遠程運行的基礎設施在一個 docker-compose 檔案中:
version: "3"
services:
web:
image: web_app
build:
context: .
dockerfile: Dockerfile
command: gunicorn my_service.wsgi --reload --bind 0.0.0.0:80 --workers 3
env_file: .env
volumes:
- ./my_repo/:/app:z
depends_on:
- db
environment:
- DOCKER=1
nginx:
image: nginx_build
build:
context: nginx
dockerfile: Dockerfile
volumes:
- ./my_repo/:/app:z
ports:
- "7000:80"
... # db and so on
如您所見,我使用 Gunicorn 為應用程式提供服務,并將 Nginx 作為代理(用于靜態檔案和 Let's Encrypt 設定。Nginx 容器有一些自定義:
FROM nginx:1.21-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d
nginx.conf 檔案是一個帶有靜態映射的反向代理:
server {
listen 80;
location / {
proxy_pass http://web;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /static/ {
alias /app/my_repo/static/;
}
}
設定后在服務器上運行這個讓我們在 Nginx 容器中加密作業沒有任何問題,但在本地我得到“CSRF 驗證失敗。請求中止。” 每次提交表單時都會出錯(例如,在 Django Admin 中創建一個虛擬用戶)。我公開了網路埠并使用它來提交表單并且它起作用了。
因此,我推斷 Nginx 配置中缺少某些東西,或者可以“告訴”Django 如何處理它的東西。那么,我缺少什么,我應該如何調查?
uj5u.com熱心網友回復:
由于您使用的是將 https 請求轉換為 http 的代理,因此您需要將 Django 配置為允許來自不同方案(自 Django 4.0 起)的POST 請求,方法是將其添加到settings.py:
CSRF_TRUSTED_ORIGINS = ["https://yourdomain.com", "https://www.yourdomain.com"]
如果這不能解決您的問題,您可以暫時DEBUG = True在生產中設定并重試。在錯誤頁面上,您將看到“失敗原因”,您可以在此處發布。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/395943.html
