Вопрос: Как добавить Access-Control-Allow-Origin в NGINX?


Как настроить заголовок Access-Control-Allow-Origin, чтобы я мог использовать веб-шрифты из моего поддомена в моем основном домене?


Заметки:

Вы найдете примеры этого и других заголовков для большинства HTTP-серверов в проектах конфигурации сервера HTML5BP https://github.com/h5bp/server-configs


124
2017-07-20 22:57


Источник


ah наконец нашел местоположение ответа / {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 *;
}

149
2017-09-01 00:25



Следуйте этим инструкциям, если вы хотите реализовать одно и то же решение для apache: stackoverflow.com/questions/11616306/... - camilo_u
По-видимому, этот модуль компилируется по умолчанию (по крайней мере, на Ubuntu). - Steve Bennett
также компилируется по умолчанию на amazon linux repo - 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


24
2017-08-24 11:01



Любой способ не повторять эти строки для каждого местоположения? Можем ли мы поставить его под серверный блок {}? - geoyws
@geoyws (без @ я не получил уведомление); вы могли бы поставить его выше местоположения, это прекрасно :) - Chris McKee
здесь отсутствуют заголовки доступа-контроля-экспонирования - chovy
@chovy его необязательный заголовок, чтобы выставлять не умолчанию по умолчанию для ajax-запросов, но я вижу, что он отключает людей так, чтобы они были добавлены должным образом. Ta - 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
    ....
  }
}

5
2018-04-17 21:15



В соответствии с политикой SF вам нужно скопировать информацию в сообщение, а не просто ссылку на нее. Веб-сайты могут исчезнуть в любое время, что приведет к потере информации. - Tim
Действительная точка @tim, обновленная для включения кода - gansbrest


Во-первых, позвольте мне сказать, что ответ @hellvinz работает на меня:

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

Тем не менее, я решил ответить на этот вопрос отдельным ответом, так как мне удалось получить это решение только после того, как вы нашли еще десять часов, чтобы найти решение.

Кажется, что Nginx по умолчанию не определяет никаких (правильных) шрифтов MIME. Следуя это Я обнаружил, что могу добавить следующее:

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 файл. Как было указано, вышеупомянутое решение затем работало.


5
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 драгоценный камень. Вот так:

in / 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