سؤال كيف يمكنني إضافة Access-Control-Allow-Origin في NGINX؟


كيف يمكنني تعيين عنوان Access-Control-Allow-Origin حتى أتمكن من استخدام خطوط الويب من النطاق الفرعي الخاص بي على النطاق الرئيسي الخاص بي؟


ملاحظات:

ستجد أمثلة على هذا ورؤوس أخرى لمعظم خوادم HTTP في مشاريع Conflicers Server HTML5BP Server https://github.com/h5bp/server-configs


133
2017-07-20 22:57


الأصل


وجدت أخيرا موقع الإجابة / {add_header Access-Control-Allow-Origin "*"؛ } - Chris McKee
ng4free.com/... - Jaydeep Gondaliya


الأجوبة:


يجب تجميع Nginx مع http://wiki.nginx.org/NginxHttpHeadersModule (افتراضي على Ubuntu وبعض توزيعات Linux الأخرى). ثم يمكنك القيام بذلك

location ~* \.(eot|ttf|woff|woff2)$ {
    add_header Access-Control-Allow-Origin *;
}

158
2017-09-01 00:25



اتبع هذه الإرشادات في حال كنت تريد تطبيق نفس الحل على apache: stackoverflow.com/questions/11616306/... - camilo_u
يبدو أن هذه الوحدة يتم تجميعها افتراضيًا (على الأقل على Ubuntu). - Steve Bennett
أيضا تجميعها بشكل افتراضي على الأمازون لينكس ريبو - Ross
في أي ملف وموقع يجب علينا وضع هذا التوجيه الموقع؟ - Sumit Arora
لا يعمل بالنسبة لي. Nginx 1.10.0، Ubuntu 16.04 - Omid Amraei


جواب أكثر حداثة:

#
# Wide-open CORS config for nginx
#
location / {
     if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        #
        # Om nom nom cookies
        #
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        #
        # Custom headers and headers various browsers *should* be OK with but aren't
        #
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
        #
        # Tell client that this pre-flight info is valid for 20 days
        #
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        add_header 'Content-Length' 0;
        return 204;
     }
     if ($request_method = 'POST') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
     }
     if ($request_method = 'GET') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
     }
}

مصدر: https://michielkalkman.com/snippets/nginx-cors-open-configuration.html

قد ترغب أيضا في إضافة Access-Control-Expose-Headers (بنفس التنسيق مثل Access-Control-Allow-Headers) من أجل كشف رؤوسك المخصصة و / أو "غير البسيطة" لطلبات ajax.

Access-Control-Expose-Headers (optional) - The XMLHttpRequest 2 object has a 
getResponseHeader() method that returns the value of a particular response 
header. During a CORS request, the getResponseHeader() method can only access 
simple response headers. Simple response headers are defined as follows:

    Cache-Control
    Content-Language
    Content-Type
    Expires
    Last-Modified
    Pragma
 If you want clients to be able to access other headers, you have to use the
 Access-Control-Expose-Headers header. The value of this header is a comma-
 delimited list of response headers you want to expose to the client.

-http://www.html5rocks.com/en/tutorials/cors/

تصميمات لخوادم الويب الأخرى http://enable-cors.org/server.html


29
2017-08-24 11:01



أي طريقة لعدم تكرار هذه الخطوط لكل موقع؟ يمكننا وضعه تحت كتلة الخادم {}؟ - geoyws
geoyws (بدون @ لم أحصل على إشعار) ؛ يمكنك وضعها فوق الموقع ، هذا جيد :) - Chris McKee
عناصر التحكم في الوصول - كشف - غير موجودة هنا - chovy
chovy لها رأسية اختيارية لفضح حالات عدم التخلف عن الوصول إلى طلبات ajax ، ولكن يمكنني رؤيته ينطلق من الأشخاص الذين تمت إضافتهم على النحو الواجب. تا - Chris McKee
يرجى تجنب استخدام if في nginx - حتى الدليل الرسمي لا يشجعها. - aggregate1166877


إليك المقالة التي كتبتها والتي تتجنب بعض التكرار لـ GET | POST. يجب أن تحصل على الذهاب مع CORS في Nginx.

التحكم في الوصول nginx تسمح المنشأ

في ما يلي مقتطف العينة من المشاركة:

server {
  listen        80;
  server_name   api.test.com;


  location / {

    # Simple requests
    if ($request_method ~* "(GET|POST)") {
      add_header "Access-Control-Allow-Origin"  *;
    }

    # Preflighted requests
    if ($request_method = OPTIONS ) {
      add_header "Access-Control-Allow-Origin"  *;
      add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
      add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";
      return 200;
    }

    ....
    # Handle request
    ....
  }
}

6
2018-04-17 21:15



وفقًا لسياسة SF ، يلزمك نسخ المعلومات إلى المشاركة ، وليس مجرد الارتباط بها. يمكن أن تختفي مواقع الويب في أي وقت ، مما يؤدي إلى فقدان المعلومات. - Tim
صالح @ نقطة ، تحديث لتضمين الرمز - gansbrest


أولاً ، دعني أقول إن إجابةhellvinz تعمل لي:

location ~* \.(eot|ttf|woff|woff2)$ {
    add_header Access-Control-Allow-Origin *;
}

ومع ذلك ، فقد قررت الإجابة عن هذا السؤال بإجابة منفصلة لأنني تمكنت فقط من الحصول على هذا الحل بعد العمل في حوالي عشر ساعات أخرى للبحث عن حل.

يبدو أن Nginx لا تحدد أي أنواع MIME (صحيحة) للخط بشكل افتراضي. باتباع هذا tuorial وجدت أنه يمكنني إضافة ما يلي:

application/x-font-ttf           ttc ttf;
application/x-font-otf           otf;
application/font-woff            woff;
application/font-woff2           woff2;
application/vnd.ms-fontobject    eot;

لي etc/nginx/mime.types ملف. كما ذكر ، حل ثم حلها.


6
2018-01-04 15:24



سأشير عادة إلى الأشخاص للتحقق من ملف نوع mime على H5BP github.com/h5bp/server-configs-nginx/blob/master/mime.types :) - Chris McKee


لا يعمل توجيه add_header التقليدي الخاص بـ Nginx مع استجابات 4xx. نظرًا لأننا لا نزال نريد إضافة رؤوس مخصصة إليهم ، نحتاج إلى تثبيت الوحدة ngx_headers_more لنتمكن من استخدام التوجيه more_set_headers ، الذي يعمل أيضًا مع 4xx من الردود.

sudo apt-get install nginx-extras

ثم استخدام more_set_headers في ملف nginx.conf ، لقد قمت بلصق النموذج أدناه

server {
    listen 80;
    server_name example-site.com;
    root "/home/vagrant/projects/example-site/public";

    index index.html index.htm index.php;

    charset utf-8;

    more_set_headers 'Access-Control-Allow-Origin: $http_origin';
    more_set_headers 'Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE, HEAD';
    more_set_headers 'Access-Control-Allow-Credentials: true';
    more_set_headers 'Access-Control-Allow-Headers: Origin,Content-Type,Accept,Authorization';

    location / {
        if ($request_method = 'OPTIONS') {
            more_set_headers 'Access-Control-Allow-Origin: $http_origin';
            more_set_headers 'Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE, HEAD';
            more_set_headers 'Access-Control-Max-Age: 1728000';
            more_set_headers 'Access-Control-Allow-Credentials: true';
            more_set_headers 'Access-Control-Allow-Headers: Origin,Content-Type,Accept,Authorization';
            more_set_headers 'Content-Type: text/plain; charset=UTF-8';
            more_set_headers 'Content-Length: 0';
            return 204;
        }
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off;
    error_log  /var/log/nginx/example-site.com-error.log error;

    sendfile off;

    client_max_body_size 100m;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
    }

    location ~ /\.ht {
        deny all;
    }
}

2
2018-05-30 10:41





في حالتي ، باستخدام Rails 5 ، كان حل العمل الوحيد يضيف rack-cors جوهرة. مثل ذلك:

في / Gemfile

# Gemfile
gem 'rack-cors'

في config / initializers / cors.rb

# config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'localhost:4200'
    resource '*',
      headers: :any,
      methods: %i(get post put patch delete options head)
  end
end

مصدر: https://til.hashrocket.com/posts/4d7f12b213-rails-5-api-and-cors


0
2018-05-04 23:07



كيف يساعد ذلك nginx في خدمة الملفات الثابتة؟ - Walf
كنت تستخدم nginx بمثابة وكيل عكس لخدمة التطبيق القضبان 5. هذه حالة خاصة حيث لا يأتي تقييد CORS من nginx ولكن من أصل تطبيق Rails وراءه. - xyz