CORS проблема с Angularjs + Spring-boot + nginx - PullRequest
0 голосов
/ 16 декабря 2018

Итак, я выдергиваю свои волосы уже пару дней.У меня есть бэкэнд-сервер, использующий Spring-boot с Rest API

Этот сервер вызывается из интерфейса веб-интерфейса с помощью AngularJS, также обрабатываемого Nginx.

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

enter image description here

Я знаю, что вы думаете: просто, простодобавьте add_header 'Access-Control-Allow-Origin' 'http://[MY_IP]'; в ваш файл nginx.conf на сервере, и все будет работать, как здесь .или здесь .

Но это не так.Я перепробовал все, переместив его в разные места, поставив вместо адреса знак «*», включив и отключив SSL ... Единственное, что работает, - это когда я вручную отключаю ограничения Cross-Origin в браузере.И самое приятное, что когда я отключаю эти ограничения, в консоли отладки моего браузера можно увидеть заголовок Access-Control-Allow-Origin, установленный на http://[MY_IP]!

Любая идеячто может быть не так?

Вот мой nginx.conf файл:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    include /etc/nginx/sites-enabled/*;
}

Вот мой /etc/nginx/sites-enabled/default.conf файл:

upstream backend_api {
    server 10.34.18.2:8080;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;

    root /var/www/html/;
    index index.html;

    client_max_body_size 5M;

    location /todos {
        access_log  /var/log/nginx/todos.backend.access.log;
        error_log   /var/log/nginx/todos.backend.error.log;

        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://backend_api;
    }

    location / {
        access_log  /var/log/nginx/todos.frontend.access.log;
        error_log   /var/log/nginx/todos.frontend.error.log;

        try_files $uri $uri/ =404;
    }

}

Я создаю символическоессылка:

ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

1 Ответ

0 голосов
/ 16 декабря 2018

Я не уверен, что это заставит cors работать, но это может помочь приблизиться к решению:

Access-Control-Allow-Origin: http://[MY_IP] - не единственный заголовок, о котором вам нужно позаботиться.

Поскольку Content-Type равно application/json, а также, вы не используете непростые заголовки, вам также нужно будет дать специальное разрешение для заголовка Content-Type, то же самое с Accept-Encoding и DNT

Access-Control-Allow-Headers: Content-Type, Accept-Encoding, DNT

Я не уверен в этом для этого конкретного GET, но в любом случае также разрешенные методы:

Access-Control-Allow-Methods: GET

И если вы отправляете куки, заголовок авторизации или клиентские сертификаты для аутентификации:

Access-Control-Allow-Credentials: true

Я не думаю, что это ваш текущий случай, но, пожалуйста, обратите внимание, что возвращение Access-Control-Allow-Credentials: true и слепая репликация полученного Origin в ответе Access-Control-Allow-Origin позволяет любому сайту получить доступ к вашему серверу, выдавая себя за владельца учетных данных.

И на случай, если вас соблазнят, ACAO: * с ACAC: true не будет работать согласно спецификации.

Возможно, вам также придетсяпозаботьтесь о методе OPTIONS, вызываемом во время предпечатной проверки cors, который должен соответствовать тому, что будет отвечать фактический вызов.

И помните, что отказ от возврата одного из этих заголовков является способом отрицать его.

Ссылка: CORS - MDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...