元々は
AWS ELB -> Apache2 -> mod_wsgi という構成だったが、
AWS ELB -> Apache2 -> uwsgi と、Djangoサーバを uwsgi に変えたら、
ログインフォームを送信する時など、django csrf 認証に失敗するようになった。
DEBUG = True で見てみると
アクセス禁止 (403)
CSRF検証に失敗したため、リクエストは中断されました。
Help
Reason given for failure:
Referer checking failed - https://example.com.com/some-path/ does not match any trusted origins.
In general, this can occur when there is a genuine Cross Site Request Forgery, or when Django's CSRF mechanism has not been used correctly. For POST forms, you need to ensure:
Your browser is accepting cookies.
The view function passes a request to the template's render method.
In the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL.
If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data.
You're seeing the help section of this page because you have DEBUG = True in your Django settings file. Change that to False, and only the initial error message will be displayed.
You can customize this page using the CSRF_FAILURE_VIEW setting.
ELB で HTTPS を受け、Apache には 80 でリクエスト、uwsgi は HTTP プロトコルをリッスンしている(uwsgiプロトコルではない)
Apacheの設定は
ProxyPass / http://127.0.0.1:8081/
ProxyPassReverse / http://127.0.0.1:8081/
Alias /static/ /var/django/xxxxx/staticfiles/
ProxyPass /static/ !
こんな感じ。
Django のコードを検索してみると
csrf.py
REASON_BAD_REFERER = "Referer checking failed - %s does not match any trusted origins."
こうなっていて、コードを読んで見ると CSRF_TRUSTED_ORIGINS にドメインを入れれば良いっぽい。
CSRF_TRUSTED_ORIGINS = [".example.com"] これで良い
コメント