私は数日の間、私の髪を引き出しています。 Nginx、Gunicorn、およびDjangoを使用しているバックエンドサーバーがあります。私はDjango Rest FrameworkとRESTサーバーとして使用し、Django Rest Authでトークン認証を使用します。このサーバのアドレスですこのサーバはアドレスdev.mysite.comNginx CORS(角度付き)
すべてに、また、nginxので扱わAngularJSを使用して、フロントエンド・インターフェースから呼び出され
api.dev.mysite.comあなたが見ることができるように、2つのドメインは異なっています。私はバックエンドへのガラス張りからの要求をしようとするたびに、私は次のエラーを取得する:
Failed to load resource: Origin https://dev.mysite.com is not allowed by Access-Control-Allow-Origin.
私はあなたが何を考えて知っている:簡単に、ちょうどバックエンドであなたのnginx.conf
ファイルにadd_header 'Access-Control-Allow-Origin' 'http://dev.mysite.com';
を追加し、すべてが動作します、のようなhere.またはhere.
しかし、それはありません。私は、アドレスの代わりに '*'を入れて、SSLの有効化と無効化をして、別の場所に移動してみました... ブラウザでクロスソースの制限を手動で無効にした場合のみ動作します。そして、私がこれらの制限を無効にすると、ブラウザのデバッグコンソールにAccess Control-Allow-Originヘッダーがhttp://dev.mysite.comに設定されていることがわかります。
何が問題になっているのでしょうか?私は私の問題への解決策を見つけたよし
worker_processes 1;
user me staff;
error_log /tmp/nginx.error.log;
events {
worker_connections 1024; # increase if you have lots of clients
accept_mutex off; # set to 'on' if nginx worker_processes > 1
}
http {
include mime.types;
default_type application/octet-stream;
access_log /tmp/nginx.access.log;
sendfile on;
upstream app_server {
# for UNIX domain socket setups
server unix:/tmp/gunicorn.sock fail_timeout=0;
}
# Common SSL Settings
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_prefer_server_ciphers on;
ssl_ciphers ALL:!ADH:!EXP:!LOW:!RC2:!3DES:!SEED:!RC4:+HIGH:+MEDIUM:!kEDH;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
server {
# if no Host match, close the connection to prevent host spoofing
listen 80 default_server;
return 444;
}
server {
listen 443 ssl;
server_name api.dev.mysite.com;
# Self-signed certificate.
ssl_certificate ssl/nginx-selfsigned.crt;
ssl_certificate_key ssl/nginx-selfsigned.key;
access_log /tmp/api.dev.intelligence.access.log;
error_log /tmp/api.dev.intelligence.error.log;
location/{
add_header 'Access-Control-Allow-Origin' 'https://dev.mysite.com';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Accept-Encoding';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
proxy_pass http://127.0.0.1:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header X-Forwarded-Protocol $scheme;
}
}
server {
client_max_body_size 4G;
# Self-signed certificate.
ssl_certificate ssl/nginx-selfsigned-front.crt;
ssl_certificate_key ssl/nginx-selfsigned-front.key;
# Listen on 80 and 443
listen 80;
listen 443 ssl;
listen [::]:443 ssl;
# set the correct host(s) for your site
server_name dev.mysite.com;
# Redirect all non-SSL traffic to SSL.
if ($ssl_protocol = "") {
rewrite^https://$host$request_uri? permanent;
}
keepalive_timeout 5;
access_log /tmp/dev.intelligence.access.log;
error_log /tmp/dev.intelligence.error.log;
location/{
root /path/to/app/current/;
index index.html index.htm;
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /path/to/app/current/public;
}
}
}
ない特定のあなたの質問への答えが、[ジャンゴ・CORS-ミドルウェア](https://github.com/zestedesavoir/django-cors-middleware)は、nginxの対ジャンゴ側に構成することで、これが容易になります。 – YPCrumble
CORSがお客様の要求を許可するには、CORSがサーバー側でお客様のクライアントをホワイトリストに登録する必要があります。それが役に立ったら、[this](http://stackoverflow.com/a/38188591/6522072)を参照してください。 – kapilsdv
あなたのアドバイスをありがとう。私はDjango CORS Middlewareをインストールし、settings.pyに以下の行を追加しました: 'CORS_ORIGIN_WHITELIST =( 'dev.mysite.com')'しかし、問題は解決しません。私は 'CORS_ORIGIN_ALLOW_ALL = True'でも試しました。 –