Puncte:0

Poate ceva din configurația mea Nginx să implice de ce backend-ul meu nu trimite antetul „Access-Control-Allow-Origin” în cererea POST?

drapel in

*Edit 1: eroarea pare să fie doar cu POST cereri

Am un site web frontend gazdă locală. Există o pagină de înregistrare pe localhost/registru

Site-ul web apelează la o funcție de backend pentru a înregistra un utilizator localhost:8080/api/register

Folosesc Axios pentru a POST numele de utilizator și parola. Browserul trimite două solicitări: cererea OPȚIUNI înainte de zbor și apoi cererea POST.

Utilizatorul este creat cu succes, totuși browserul afișează o eroare pentru solicitarea POST:

Motiv: antetul CORS âAccess-Control-Allow-Originâ lipsește

Și într-adevăr lipsește din răspunsul la POST. Presupunând că fișierul meu backend cors este configurat corect, ar putea problema să fie din combinația dintre configurația mea Docker + Nginx care îl blochează sau proxy anteturile într-un loc greșit?

Aceasta este configurația mea nginx:

Server {
    asculta 8080;
    index index.php index.html;    
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/html/public;
    
    Locație / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    
    locație ~ \.php$ {        
        try_files $uri = 404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    
}

  Server {    
    asculta 80;       
      Locație / {      
      proxy_pass http://node:3000;
      
    }
  }

iar acesta este al meu docker-compose.yml:

retele:
    rețeaua mea:
        şofer: pod

Servicii:
    nginx:
        imagine: nginx:stable-alpine
        container_name: nginx
        porturi:
            - „8080:8080”
            - „80:80”            
        volume:            
            - ./php:/var/www/html 
            - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
            
        depinde de:
            - php
            - nod
        retele:
            - rețeaua mea
    
    php:        
        construi:
            context: ./php
            dockerfile: Dockerfile
        nume_container: php
        utilizator: „1000:1000”
        volume:
            - ./php:/var/www/html
        porturi:
            - „9000:9000”
        retele:
            - rețeaua mea

    nodul:
        construi:
            context: ./react
            dockerfile: Dockerfile
        container_name: următorul        
        volume:
            - ./react:/var/www/html                
        porturi:
            - „3000:3000”       

        retele:
            - rețeaua mea


           

**Edit 2:

Backend-ul este Laravel și are un middleware CORS care ar trebui să aibă grijă de el. Și de fapt pare să funcționeze pentru că OBȚINE și OPȚIUNI cererea trece fără eroare, doar POST cererea aruncă această eroare.

Acesta este fișierul de configurare CORS (cors.php) în Laravel:

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

'allowed_methods' => ['*'],

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

'allowed_origins_patterns' => ['*'],

'allowed_headers' => ['*'],

'exposed_headers' => [],

'max_age' => 0,

'supports_credentials' => adevărat
drapel us
Nu există nimic în această configurație care să adauge antetul CORS. Trebuie să ai grijă de asta.
Stackerito avatar
drapel in
Mulțumesc. Ai dreptate că nginx nu are nimic, dar backend-ul are un middlware care se ocupă de asta și, de fapt, când trimit cererea `GET` și `OPTIONS`, trimite anteturile corecte. Dar cu `POST` nu. După cum ați spus, pentru a rezolva problema solicitării `POST`, am adăugat următoarele la blocul serverului PHP și acum funcționează: `dacă ($metoda_cerere = POST){ add_header „Acces-Control-Allow-Origin” „http://localhost”; add_header 'Acces-Control-Allow-Credentials' 'true'; }`. Dar de ce nu am nevoie de asta pentru `GET` și `OPTIONS`? a adăugat codul backend
drapel us
Putem ghici care a fost procesul de gândire al dezvoltatorului de middleware atunci când l-au implementat.
Stackerito avatar
drapel in
Deci, pentru moment, ar trebui să-mi păstrez codul în blocul serverului pentru solicitările `POST`? Noua mea configurație vi se pare OK sau îmi lipsește ceva care ar putea cauza probleme? (Funcționează, dar poate o pot îmbunătăți)
drapel us
Da, blocul „server” este în regulă. Cu toate acestea, cea mai bună practică este să inversați proxy o cale către URL-ul backend în loc să utilizați un alt port pentru acces backend diferit.
Stackerito avatar
drapel in
Îmi puteți explica cum să-mi schimb configurația actuală pentru a o face? Am crezut că asta fac deja prin proxy la backend-ul meu la portul 8080?
drapel us
Termenul de proxy inversă de mai sus nu a fost de fapt exact. Trebuie să faceți un bloc `location /api` în blocul `server` cu portul 80, apoi mutați configurația pentru portul 8000 în acea secțiune. Adică, ar trebui să serviți backend-ul și prin portul 80, doar cu un prefix diferit.
Stackerito avatar
drapel in
Am făcut ceva ușor diferit: am folosit subdomeniul în loc de ruta `/api`. Modul în care am făcut-o a fost să adaug mai întâi `api.mysite.local` la fișierul `hosts` și apoi adăugat un bloc de server care ascultă pe portul `80` și redirecționează cererile către blocul de server care ascultă pe portul `8080` ca deci: `return 301 https://api.mysite.local$request_uri;` - este și aceasta o practică bună?
Michael Hampton avatar
drapel cz
Aceasta chiar arată ca o problemă cu Laravel, mai degrabă decât configurația dvs. nginx. Ați căutat ajutor cu el la [așa]? Poate doriți să faceți acest lucru.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.