Î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).