Вопрос или проблема
Вот мой текущий файл конфигурации nginx:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Добавьте index.php в список, если вы используете PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# Сначала попытка обслужить запрос как файл, затем
# как каталог, затем возврат к отображению 404.
try_files $uri $uri/ /index.html;
}
location /home {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
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';
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-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-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';
}
}}
В настоящее время я настроил его так, чтобы он работал так, как ожидается на сервере. Файлы обслуживаются корректно при их ссылке из index.html, и ошибки CORS отсутствуют.
Ошибки выглядят так:
Доступ к импортированному ресурсу по адресу 'http://sub.domain.io//public/bower_components/polymer/polymer.html' с источника 'http:/sub.domain.io' был заблокирован политикой CORS: заголовок 'Access-Control-Allow-Origin' отсутствует в запрашиваемом ресурсе. Следовательно, источник 'http://localhost:4200' не имеет доступа.
Я уже пытался вставить “Access-Control-Allow-Origin *;” в server {} вместо location.
Есть идеи, как это исправить?
Возможно, URL, который вы указываете в location, не является местоположением, к которому вы пытаетесь получить доступ. Ваша ошибка связана с путем http://sub.domain.io//public/bower_components/polymer/polymer.html
Попробуйте добавить раздел для location /public
с add_header 'Access-Control-Allow-Origin' '*';
Ответ или решение
Конфигурация CORS в Nginx, позволяющая файловому обслуживанию с localhost, требует корректного указания заголовков и настройки путей к ресурсам. Давайте разберем ваш текущий конфигурационный файл и предложим необходимые изменения, чтобы устранить проблемы с CORS.
Текущая конфигурация
Ваш текущий конфигурационный файл выглядит следующим образом:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ /index.html;
}
location /home {
...
}
}
Проблема с CORS
Вы получаете ошибку, связанную с CORS, когда пытаетесь получить доступ к следующим ресурсам:
Access to Imported resource at 'http://sub.domain.io//public/bower_components/polymer/polymer.html' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Эта ошибка указывает на то, что Nginx не возвращает заголовок Access-Control-Allow-Origin
, необходимый для доступа к ресурсам с другого домена (localhost в данном случае).
Решение
Чтобы решить эту проблему, вам нужно добавить соответствующие заголовки CORS в конфигурацию Nginx. Предлагаю следующие изменения:
-
Добавьте новую секцию
location
для пути/public
, так как ошибка указывает, что проблема возникает именно при попытке доступа к этому ресурсу. -
Обеспечьте, чтобы заголовок
Access-Control-Allow-Origin
был установлен для всех необходимых методов HTTP.
Вот как может выглядеть исправленный конфигурационный файл:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ /index.html;
}
location /public {
# Добавляем заголовки для CORS
add_header 'Access-Control-Allow-Origin' 'http://localhost:4200' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type' always;
add_header 'Access-Control-Max-Age' 1728000 always;
if ($request_method = 'OPTIONS') {
return 204; # Сразу возвращаем 204 для preflight запросов
}
}
}
Почему необходимы эти изменения?
-
Широкий контроль доступа: Исправленный заголовок
Access-Control-Allow-Origin
ограничивает доступ к вашему серверу только сhttp://localhost:4200
. Если вам нужно разрешить доступ с других источников, вы можете использовать wildcard (*
), но это менее безопасно. -
Поддержка других методов: Выявление других методов HTTP (GET, POST, OPTIONS) также обеспечит, что ваш сервер будет готов обрабатывать запросы любого типа, что важно для взаимодействия различных частей вашего приложения.
-
Обработка preflight запросов: Предварительный запрос (preflight request) для OPTIONS не возвращает содержимое, а только заголовки, поэтому мы используем
return 204;
для экономии ресурсов.
Заключение
Теперь, после применения данных изменений, ваша конфигурация Nginx должна корректно обрабатывать запросы к ресурсам с localhost, предотвращая возникновение CORS ошибок. Не забудьте перезагрузить сервер Nginx после изменения конфигурации с помощью команды:
sudo systemctl reload nginx
Постарайтесь следить за возможными другими настройками вашего приложения, которые могут также влиять на CORS, и тестируйте изменения. Если будут другие вопросы, не стесняйтесь задавать!