Рейтинг:0

Может ли что-то в моей конфигурации Nginx указывать, почему мой сервер не отправляет заголовок «Access-Control-Allow-Origin» в запросе POST?

флаг in

* Редактировать 1: ошибка, кажется, только с ПУБЛИКОВАТЬ Запросы

У меня есть внешний веб-сайт на локальный хост. Есть страница регистрации локальный/регистр

Веб-сайт вызывает внутреннюю функцию для регистрации пользователя на локальный: 8080/API/регистр

Я использую Axios для POST имени пользователя и пароля. Браузер отправляет два запроса: предварительный запрос OPTIONS, а затем запрос POST.

Пользователь успешно создан, однако браузер выдает ошибку для POST-запроса:

Причина: отсутствует заголовок CORS «Access-Control-Allow-Origin».

И действительно, его нет в ответе на POST. Предполагая, что мой внутренний файл cors настроен правильно, может ли проблема быть связана с комбинацией моей настройки Docker + Nginx, которая блокирует его или проксирует заголовки в неправильное место?

Это моя конфигурация nginx:

сервер {
    слушать 8080;
    индекс index.php index.html;    
    журнал_ошибок /var/log/nginx/error.log;
    журнал_доступа /var/log/nginx/access.log;
    корень /var/www/html/public;
    
    место расположения / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    
    расположение ~ \.php$ {        
        try_files $uri = 404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass PHP: 9000;
        fastcgi_index index.php;
        включить fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    
}

  сервер {    
    слушать 80;       
      место расположения / {      
      прокси_пасс http://узел:3000;
      
    }
  }

и это мой докер-compose.yml:

сети:
    моя сеть:
        водитель: мост

Сервисы:
    нгинкс:
        изображение: nginx: стабильный-альпийский
        имя_контейнера: nginx
        порты:
            - "8080:8080"
            - "80:80"            
        тома:            
            - ./php:/var/www/html 
            - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
            
        зависит от:
            - пхп
            - узел
        сети:
            - моя сеть
    
    php:        
        строить:
            контекст: ./php
            докерфайл: Докерфайл
        имя_контейнера: php
        пользователь: "1000:1000"
        тома:
            - ./php:/var/www/html
        порты:
            - "9000:9000"
        сети:
            - моя сеть

    узел:
        строить:
            контекст: ./реагировать
            докерфайл: Докерфайл
        имя_контейнера: следующий        
        тома:
            - ./реагировать:/var/www/html                
        порты:
            - "3000:3000"       

        сети:
            - моя сеть


           

** Редактировать 2:

Бэкэнд — это Laravel, и у него есть промежуточное ПО CORS, которое должно позаботиться об этом. И на самом деле, похоже, это работает, потому что ПОЛУЧАТЬ и ПАРАМЕТРЫ запрос проходит без ошибок, только ПУБЛИКОВАТЬ запрос выдает эту ошибку.

Это файл конфигурации CORS (корс.php) в Ларавеле:

'paths' => ['api/*', 'sanctum/csrf-cookie'],

'разрешенные_методы' => ['*'],

'allowed_origins' => ['http://localhost'],

'allowed_origins_patterns' => ['*'],

'разрешенные_заголовки' => ['*'],

'exposed_headers' => [],

'max_age' => 0,

'supports_credentials' => правда
флаг us
В этой конфигурации нет ничего, что могло бы добавить заголовок CORS. Вам нужно позаботиться об этом.
Stackerito avatar
флаг in
Спасибо. Вы правы в том, что у nginx ничего нет, но у бэкенда есть промежуточное ПО, которое позаботится об этом, и на самом деле, когда я отправляю запрос `GET` и `OPTIONS`, он отправляет правильные заголовки. Но с `POST` нет. Как вы сказали, чтобы исправить проблему с запросом POST, я добавил следующее в блок PHP-сервера, и теперь он работает: `если ( $request_method = POST ){ add_header 'Access-Control-Allow-Origin' 'http://localhost'; add_header 'Access-Control-Allow-Credentials' 'true'; }`. Но почему мне это не нужно для `GET` и `OPTIONS`? добавил внутренний код
флаг us
Мы можем только догадываться, каким был мыслительный процесс разработчиков промежуточного программного обеспечения, когда они его реализовывали.
Stackerito avatar
флаг in
Итак, на данный момент я должен хранить свой код внутри блока сервера для запросов `POST`? Моя новая конфигурация кажется вам приемлемой или я упустил что-то, что может вызвать проблемы? (Это работает, но, возможно, я могу сделать это лучше)
флаг us
Да, блок «сервер» в порядке. Однако рекомендуется использовать обратный прокси-сервер для пути к серверному URL-адресу вместо использования другого порта для другого доступа к серверу.
Stackerito avatar
флаг in
Можете ли вы объяснить мне, как изменить мою текущую конфигурацию, чтобы сделать это? Я думал, что это то, что я уже делаю, проксируя свой сервер через порт 8080?
флаг us
Вышеупомянутый термин «обратный прокси» на самом деле неверен. Вам нужно сделать блок location/api внутри блока server с портом 80, а затем переместить конфигурацию для порта 8000 в этот раздел. То есть бэкенд тоже надо обслуживать через 80 порт, только с другим префиксом.
Stackerito avatar
флаг in
Я сделал немного по-другому: я использовал субдомен вместо маршрута `/api`. Я сделал это так: сначала добавил `api.mysite.local` в файл `hosts`, а затем добавил блок сервера, который прослушивает порт `80`, и перенаправляет запросы на блок сервера, который слушает порт `8080`, например Итак: `return 301 https://api.mysite.local$request_uri;` - это тоже хорошая практика?
Michael Hampton avatar
флаг cz
Это действительно похоже на проблему с Laravel, а не с вашей конфигурацией nginx. Вы обращались за помощью с этим на [так]? Вы можете сделать это.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.