2016-07-13 5 views
1

私は数日の間、私の髪を引き出しています。 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; 
    } 
    } 
} 
+0

ない特定のあなたの質問への答えが、[ジャンゴ・CORS-ミドルウェア](https://github.com/zestedesavoir/django-cors-middleware)は、nginxの対ジャンゴ側に構成することで、これが容易になります。 – YPCrumble

+0

CORSがお客様の要求を許可するには、CORSがサーバー側でお客様のクライアントをホワイトリストに登録する必要があります。それが役に立ったら、[this](http://stackoverflow.com/a/38188591/6522072)を参照してください。 – kapilsdv

+0

あなたのアドバイスをありがとう。私はDjango CORS Middlewareをインストールし、settings.pyに以下の行を追加しました: 'CORS_ORIGIN_WHITELIST =( 'dev.mysite.com')'しかし、問題は解決しません。私は 'CORS_ORIGIN_ALLOW_ALL = True'でも試しました。 –

答えて

0

は、ここに私のnginx.confファイルです。私nginx.confファイルからすべての 'はadd_header' 行を削除

  1. :私は3つのことをやりました。それは今のようになります。

    location/{ 
        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; 
    } 
    
  2. ジャンゴCORSヘッダをインストールし、私のsettings.pyに以下の行を追加:

    CORS_ORIGIN_ALLOW_ALL = False 
    CORS_ALLOW_CREDENTIALS = True 
    CORS_ORIGIN_WHITELIST = (
        'dev.myapp.com' 
    ) 
    
  3. は角度で私の.configファイルに次の行を追加しました

    $httpProvider.defaults.useXDomain = true; 
    $httpProvider.defaults.withCredentials = true; 
    delete $httpProvider.defaults.headers.common['X-Requested-With']; 
    

    私はこれらのものをすべて別々に試しましたが、私は3つすべてが必要だったと思います。

関連する問題