Puncte:3

Este imposibil să aveți antete condiționate în Nginx?

drapel cn

În prezent, încerc să returnez doar un set de anteturi CORS condiționat, folosind Nginx. La început mi s-a părut o sarcină simplă, deoarece aveam deja această configurație de lucru:

aplicația api în amonte {
  server unix:/tmp/api-app.sock fail_timeout=0;
}

Server {
  asculta 80;
  # [alte chestii de server...]

  # anteturi CORS adăugate la TOATE răspunsurile acestui server (necesare pentru toate solicitările)
  more_set_headers 'Metode-Control-Acces-Permite: GET,POST,PATCH,PUT,DELETE,OPTIONS';
  more_set_headers 'Acces-Control-Allow-Origin: *';
  more_set_headers 'Acces-Control-Allow-Credentials: true';
  more_set_headers 'Metoda-Solicitare-Control-Acces: GET,POST,PATCH,PUT,DELETE,OPTIONS';
  more_set_headers 'Acces-Control-Request-Headers: Content-Type';
  more_set_headers 'Control-Acces-Permite-anteturi: Origine,X-Solicitat-Cu,Tip-conținut,Accept,Id-sesiune,Id-rol,Id-vizitator,Locație-X-Window';
  more_set_headers 'Control-Acces-Expunere-anteturi: X-Total-Inregistrări, X-Total-Pagini, X-Pagină, X-Per-Pagină, X-Folder-Hierarchy';

  Locație / {
    # Pentru OPȚIUNI, cererea de returnare numai deasupra antetelor și fără conținut (permiteți și stocarea lor în cache)
    dacă ($request_method = 'OPȚIUNI') {
      # cache deasupra antetelor (Access-Control).
      add_header „Acces-Control-Max-Age” 600;

      # setați lungimea conținutului și tastați doar pentru o măsură bună:
      add_header „Lungimea conținutului” 0;
      add_header 'Content-Type' 'text/plain charset=UTF-8';

      # return 204 - fără conținut
      întoarcere 204;
    }

    # Redirecționați solicitările către aplicația reală (dacă toate condițiile de mai sus nu se potrivesc)
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
    proxy_set_header Gazdă $http_host;
    proxy_redirect dezactivat;
    proxy_read_timeout 35;
    proxy_send_timeout 35;

    proxy_pass http://api-app;
  }
}

Așa că am vrut doar să schimb secțiunea antet CORS în s.th. ca aceasta

#...
  set $cors '';

  dacă ($http_origin ~ '^https?://(some.domain|some.other.domain|other-allows.domain)') {
      set $cors 'true';
  }

  if ($cors = 'adevărat') {
      more_set_headers 'Metode-Control-Acces-Permite: GET,POST,PATCH,PUT,DELETE,OPTIONS';
      more_set_headers 'Acces-Control-Allow-Origin: $http_origin';
      more_set_headers 'Acces-Control-Allow-Credentials: true';
      more_set_headers 'Metoda-Solicitare-Control-Acces: GET,POST,PATCH,PUT,DELETE,OPTIONS';
      more_set_headers 'Acces-Control-Request-Headers: Content-Type';
      more_set_headers 'Control-Acces-Permite-anteturi: Origine,X-Solicitat-Cu,Tip-conținut,Accept,Id-sesiune,Id-rol,Id-vizitator,Locație-X-Window';
      more_set_headers 'Control-Acces-Expunere-anteturi: X-Total-Inregistrări, X-Total-Pagini, X-Pagină, X-Per-Pagină, X-Folder-Hierarchy';
  }
  

  Locație / {
#...

in orice caz nginx -t mi-a spus repede more_set_headers nu poate fi folosit într-o declarație if. Nici add_header nu poate.

Mi-am dat seama că în Locație secțiune ar funcționa. Dar știam deja că aceasta nu va fi o soluție bună, așa cum știm cu toții dacă este rău în secțiunile de locație nginx. Și am avut dreptate, deoarece atunci anteturile CORS s-ar pierde pentru cererea OPȚIUNI, aveam deja un caz dacă pentru (unul OK, așa cum se întoarce).

Am întâlnit și opțiunea de a folosi Nginxs funcția hartă. Dar asta funcționează numai dacă vreau să modific valorile antetului, nu dacă vreau să adaug un întreg bloc de anteturi.

Deci intrebarea mea este urmatoarea: Există o modalitate de a adăuga anteturi în mod condiționat (fără a folosi harta) și în afara blocului de locație? În mod ideal, să permită includerea secțiunii CORS, astfel încât să o pot folosi pe mai multe servere (adică site-uri nginx).

drapel cn
Doar pentru a fi complet, am găsit o modalitate hacker de a face acest lucru prin copierea secțiunii CORS în secțiunea de locație (unde dacă este permis) și din nou în condiționalul OTPIONS pentru a returna antetele CORS și în acest caz, dar nu vreau pentru a folosi asta în producție :P
Puncte:3
drapel us

nu stiu daca more_set_headers acceptă șiruri goale. Dacă acceptă, atunci puteți defini multiple Hartă afirmatii:

harta $http_origin $cors_methods {
    Mod implicit "";
    ~^https?://(some.domain|some.other.domain|other-allows.domain) Metode de control al accesului-permite: GET,POST,PATCH,PUT,DELETE,OPTIONS;
}

harta $http_origin $cors_origin {
    Mod implicit "";
    ~^https?://(some.domain|some.other.domain|other-allows.domain) Acces-Control-Allow-Origin: $http_origin;
}

Și apoi folosește asta:

more_set_headers $cors_methods;
more_set_headers $cors_origin;
drapel cn
Da, asta încerc să menționez cu funcția hartă. Cu toate acestea, am sperat într-o modalitate mai ușoară de a activa/dezactiva toate anteturile simultan, dar probabil că nu există.
drapel cn
De asemenea, mi-am dat seama că funcția de hartă nu poate fi folosită în blocul server, ci doar în blocul http.
drapel us
Da, `harta` trebuie definită la nivelul `http`, dar asta nu îi afectează utilitatea.

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.