我正在使用Django 1.7.7和Django REST框架编写RESTful服务器应用程序。当我在Django测试服务器上运行它时,应用程序一直运行良好。
现在,我将它部署到运行Nginx和uWSGI的AWS上的登台服务器。服务器似乎运行正常,但调用POST方法会导致“403 Forbidden”响应。如果我禁用HTTPS,则调用工作正常,因此它与HTTPS有关。
这是我网站的Nginx配置文件:
server {
listen 443 ssl;
charset utf-8;
server_name <HERE'S MY SERVER ADDRESS>;
ssl on;
ssl_certificate /etc/nginx/ssl/myapp.crt;
ssl_certificate_key /etc/nginx/ssl/myapp.key;
ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL';
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:10m;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security max-age=63072000;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:3031;
uwsgi_param UWSGI_SCHEME https;
uwsgi_param UWSGI_SCRIPT myapp.wsgi;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param HTTPS $https if_not_empty;
}
}
重申一下,如果我将listen 443 ssl
更改为listen 80 default_server
并将ssl on
更改为ssl off
,则POST方法可以正常工作。
这是uWSGI配置文件:
[uwsgi]
socket = 127.0.0.1:3031
chdir = /web/myapp/source/myapp
module = myapp.wsgi
我怀疑有一件事是CSRF标头在它找到Django的CSRF中间件之前被剥离了,但我不知道如何验证这一点。它也可能是完全不同的东西。