এনজিনেক্স / ক্রোম সহ ক্রস অরিজিন রিসোর্স শেয়ারিং (সিওআরএস)


13

নিম্নলিখিত বিভাগগুলি সহ আমার একটি ওয়েবসাইট রয়েছে:

api.example.com 
developers.example.com 
example.com

আমি উভয়কেই অনুমতি দিতে example.comএবং developers.example.comএজেএক্স অনুরোধ করতে চাই api.example.com

এখনও পর্যন্ত আমার এনজিএনএক্স কনফিগারেশনটি api.example.com, যা ইউনিকর্নের দ্বারা পরিবেশন করা একটি র্যাক অ্যাপ্লিকেশন, এর মতো দেখতে:

upstream app_server {
  server unix:/tmp/api.example.com.sock fail_timeout=0;
}

server {
       listen 80;
       server_name api.example.com;
       access_log /home/nginx/api.example.com/log/access.log;
       error_log /home/nginx/api.example.com/log/error.log;
       location / {
         add_header 'Access-Control-Allow-Origin' 'http://example.com,http://developers.example.com';
         add_header 'Access-Control-Allow-Credentials' 'true';
         add_header 'Access-Control-Allow-Headers' 'Content-Type,Accept';
         add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';

         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header Host $http_host;
         proxy_redirect off;
         proxy_pass http://app_server;
       }

}

আমার পড়ার উপর ভিত্তি করে, আমি যা করার চেষ্টা করছি তার জন্য এটি পর্যাপ্ত হওয়া উচিত।

বিকল্প প্রতিক্রিয়া:

HTTP/1.1 200 OK
Server: nginx/0.7.67
Date: Sat, 28 Apr 2012 17:20:08 GMT
Content-Type: application/json
Connection: close
Status: 200 OK
Content-Length: 0
Access-Control-Allow-Origin: http://developers.example.com,http://example.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type,Accept
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE

তবে যখন আমি Chrome কনসোলে নিম্নলিখিতগুলি চেষ্টা করি:

$.ajax("http://api.example.com", {
  type: 'get',
  contentType: "application/json",
  accept: "application/json"
}).success(function(data){
  console.log("success!", data);
}).fail(function(jqxhr, statusText){
  console.log("fail!", jqxhr, statusText);
})

আমি দেখি:

XMLHttpRequest cannot load http://api.example.com/. Origin
http://developers.example.com is not allowed by Access-Control-Allow-Origin.

এবং http://example.com এর জন্য একই ।

আমি কী মিস করছি?

আমি যদি সেট করে Access-Control-Allow-Originরাখি *তবে আমি দেখতে পাচ্ছি:

HTTP/1.1 200 OK
Server: nginx/0.7.67
Date: Sat, 28 Apr 2012 17:28:41 GMT
Content-Type: application/json
Connection: close
Status: 200 OK
Content-Length: 0
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type,Accept
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE

তবে jQuery অনুরোধটি এখনও ব্যর্থ হয়েছে, ক্রোমটি হাইলাইট করে জানিয়েছে যে প্রাক-বিমানটি OPTIONSব্যর্থ হয়েছিল (যদিও এটি ফিরে এসেছিল 200 OK)।

উত্তর:


17

সিওআরএস স্পেস অনুসারে একাধিক উত্স স্পেস দ্বারা পৃথক করা উচিত, আপনি যেমন ব্যবহার করেছেন তেমন কমা নয়, তাই এই শিরোলেখ পাঠানোর চেষ্টা করুন:

Access-Control-Allow-Origin: http://developers.example.com http://example.com

মোজিলা ডকুমেন্টেশন একাধিক উত্স উল্লেখ না যদিও, তাই যদি এখনও শুধুমাত্র পাঠানোর কাজ করে দেখুন না:

Access-Control-Allow-Origin: http://developers.example.com

যদি এটি কাজ করে তবে আপনাকে অনুমতিপ্রাপ্ত তালিকার সাথে মেলে যদি ক্লায়েন্টের দ্বারা প্রেরিত শিরোনামের Access-Control-Allow-Originমান সহ একটি শিরোনাম ফেরত দিতে আপনাকে এনগিনেক্স বা আপনার অ্যাপ্লিকেশন সার্ভারটি কনফিগার করতে হবে Origin। নিম্নলিখিত (অনির্ধারিত) nginx কনফিগারেশন এর মতো কিছু এটি করতে পারে:

if ($http_origin ~ "^(http://developers.example.com|http://example.com)$") {
    add_header "Access-Control-Allow-Origin" $http_origin;
}

এটি আমি শেষ করে যা করেছি তারই একটি অংশ। আমি শিরোনামটিও সরিয়ে দিয়েছি এবং Access-Control-Allow-Headerআমার jQuery কলটিকে এমনভাবে সংশোধন করেছি: $.ajax("http://api.example.com", { type: 'get', crossDomain: true}) যা OPTIONSপ্রিফলাইটটি একেবারে ঘটতে বাধা দেয় ।
জন লেডবেটার

1
দ্রষ্টব্য: যদি প্রদত্ত সমাধানটি আপনার পক্ষে কাজ করে না, তবে এটি এবং এটি পড়ুন । এটি আলোকিতকারী, এবং এটি কাজ করছে না এমন কারণ আপনি খুঁজে পেতে পারেন।
এর_ম

4

একটি ব্যবহার ifএকটি locationভালো একটি nginx কনফিগারেশনে ব্লক:

if ($http_origin ~ "^(http://developers.example.com|http://example.com)$") {
    add_header "Access-Control-Allow-Origin" $http_origin;
}

অদ্ভুত জিনিসগুলি করার জন্য এনজিনেক্সকে কারণ দিন। বিশেষত, proxy_passএবং try_filesপ্রত্যাশার মতো কাজ করবেন না। আরও তথ্যের জন্য http://wiki.nginx.org/IfIsEvil দেখুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.