Как добавить Access-Control-Allow-Origin в NGINX?

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


Примечания:

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

124 голоса | спросил Chris McKee 21 J000000Wednesday10 2010, 02:57:37

6 ответов


149

Nginx должен быть скомпилирован с помощью http://wiki.nginx.org/NginxHttpHeadersModule (по умолчанию для Ubuntu и некоторых других Linux дистрибутивы). Тогда вы можете сделать это

  location ~ * \. (eot | ttf | woff | woff2) $ {
    add_header Access-Control-Allow-Origin *;
}
 
ответил hellvinz 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 01 Sep 2010 04:25:20 +0400 2010, 04:25:20
24

Более свежий ответ:

  #
# Широко открытая конфигурация CORS для nginx
#
место нахождения /{
     if ($ request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        #
        # Om nom nom cookie
        #
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        #
        # Пользовательские заголовки и заголовки различных браузеров * должны быть в порядке, но не
        #
        add_header 'DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type';
        #
        # Сообщите клиенту, что эта предполетная информация действительна в течение 20 дней
        #
        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 '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 'DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type';
     }
}
 

источник: https://michielkalkman.com/snippets/nginx-cors- открытой configuration.html

Вы также можете добавить Access-Control-Expose-Headers (в том же формате, что и Access-Control-Allow-Headers), чтобы разоблачить ваши пользовательские и /или «непростые» 'заголовки для запросов ajax.

  Access-Control-Expose-Headers (необязательно). Объект XMLHttpRequest 2 имеет
getResponseHeader (), который возвращает значение конкретного ответа
заголовок. Во время запроса CORS метод getResponseHeader () может получить доступ только
простые заголовки ответов. Простые заголовки ответов определяются следующим образом:

    Cache-Control
    Content-Language
    Тип содержимого
    Истекает
    Последнее изменение
    Pragma
 Если вы хотите, чтобы клиенты имели доступ к другим заголовкам, вы должны использовать
 Заголовок Access-Control-Expose-Headers. Значение этого заголовка -
 ограниченный список заголовков ответов, которые вы хотите предоставить клиенту.
 

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

Конфигурации для других веб-серверов http://enable-cors.org/server.html

ответил Chris McKee 24 PM00000020000000931 2015, 14:01:09
5

Вот статья, которую я написал, которая позволяет избежать дублирования для GET | POST. Это должно заставить вас идти с CORS в Nginx.

контроль доступа nginx позволяет происходить

Вот фрагмент примера из сообщения:

  server {
  слушайте 80;
  имя_сервера api.test.com;


  место нахождения /{

    # Простые запросы
    if ($ request_method ~ * "(GET | POST)") {
      add_header "Access-Control-Allow-Origin" *;
    }

    # Предварительно запрошенные запросы
    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» «Авторизация, Происхождение, X-Запрошенный-С, Content-Type, Accept»;
      возврат 200;
    }

    ....
    # Обращение с ручкой
    ....
  }
}
 
ответил gansbrest 18 AMpTue, 18 Apr 2017 00:15:07 +030015Tuesday 2017, 00:15:07
5

Во-первых, позвольте мне сказать, что ответ @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 . Как было указано, вышеупомянутое решение затем работало.

ответил DazBaldwin 4 Jpm1000000pmWed, 04 Jan 2017 18:24:28 +030017 2017, 18:24:28
2

Традиционная директива add_header от Nginx не работает с ответами 4xx. Поскольку мы все еще хотим добавить к ним пользовательские заголовки, нам нужно установить модуль ngx_headers_more, чтобы иметь возможность использовать директиву more_set_headers, которая также работает с ответами 4xx.

  sudo apt-get install nginx-extras
 

Затем используйте more_set_headers в файле nginx.conf, я вставил свой пример ниже

  server {
    слушайте 80;
    имя_сервера 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»;

    место нахождения /{
        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; кодировка = 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 100м;

    location ~ \ .php $ {
        fastcgi_split_path_info ^ (. + \. php) (/.+) $;
        fastcgi_pass unix: /var/run/php5-fpm.sock;
        fastcgi_index index.php;
        включить 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 {
        отрицать все;
    }
}
 
ответил Hasnat Safder 30 Maypm18 2018, 13:41:13
0

В моем случае, используя Rails 5, единственным рабочим решением было добавление драгоценного камня rack-cors . Например:

in /Gemfile

  # Gemfile
драгоценный камень "стойка-корс"
 

в config /initializers /cors.rb

  # config /initializers /cors.rb
Rails.application.config.middleware.insert_before 0, Rack :: Cors do
  разрешить
    localhost: 4200 '
    ресурс '*',
      заголовки:: любой,
      методы:% i (get post put patch delete options head)
  конец
конец
 

источник: https://til.hashrocket.com /сообщений /4d7f12b213-рельсы-5-апи-и-CORS

ответил xyz 5 Mayam18 2018, 02:07:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132