Puncte:0

Erori Nginx Reverse Proxy 403 la solicitările POST

drapel es

Încerc să configurez un teanc de servicii în Docker: Unifi, PHP, Nginx și Certbot, unde Unifi și PHP sunt serviciile de backend și Nginx le servește în modul proxy invers, în timp ce Certbot rulează periodic pentru a obține certificate SSL pentru Nginx .

Îl am în mare parte funcțional; toate cererile GET funcționează și pot vizualiza pagina pe care Unifi o deservește. Cu toate acestea, toate solicitările POST prin AJAX generează o eroare 403 din cauza CORS.

Acum, nu sunt foarte familiarizat cu cum să manipulez anteturile CORS sau cu ce cauzează eroarea. Este browserul, Nginx sau unifi? Cu toate acestea, Nginx este tot ceea ce pot schimba configurația.

Iată eroarea pe care o primesc la toate solicitările de postare AJAX, de la inspectorul browserului/monitorul de rețea:

POST
schema https
exemplu gazdă.com:8443
nume de fișier /api/stat/device
Adresă (adresa_ip_server):8443
Status 403 Interzis
Versiunea HTTP/2
Transferat 141 B (dimensiune 0 B)
Politica referitor strict-origin-when-cross-origin
    
    
ANTETE DE RĂSPUNS    
lungimea conținutului 0
text de tip conținut/ simplu
data vineri, 17 septembrie 2021 00:59:09 GMT
server nginx
X-Firefox-Spdy h2
    
    
ANTETE DE CERERE 
Acceptă aplicație/json, text/plat, */*
Acceptare-Codificare gzip, deflate, br
Accept-Language en-US,en;q=0,5
Conexiunea menține vie
Lungimea conținutului 0
Cookie unifises=(token aleatoriu aici); csrf_token=(token aleatoriu aici)
DNT 1
Gazdă example.com:8443
Origine https://example.com:8443
Referer https://example.com:8443/setup/configure/controller-name
Sec-Fetch-Dest gol
Sec-Fetch-Mode cors
Sec-Fetch-Site de aceeași origine
remorci TE
Agent de utilizator Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
X-Csrf-Token (jeton aleatoriu aici)

Iată configurația Nginx:

# activează compresia GZIP
gzip on;

# nivel de compresie (1-9)
# 6 este un compromis bun între utilizarea CPU și dimensiunea fișierului
gzip_comp_level 6;

# limită minimă de dimensiune a fișierului în octeți pentru a evita compresia negativă
gzip_min_length 256;

# comprimați datele pentru clienții care se conectează prin proxy
gzip_proxied orice;

# direcționează proxy-urile să memoreze în cache atât versiunile obișnuite, cât și cele GZIp ale unui material
gzip_vary on;

# dezactivează compresia GZIP pentru browserele vechi
gzip_disable „msie6”;

Server {
    asculta 80;
    asculta [::]:80;

    nume_server example.com;

    locație ~ /.well-cunoscut/acme-challenge {
        permite tuturor;
        root /var/www/certbot/;
        }
    # Redirecționați căile Unifi relevante Adresa și Portul Unifi
    Locație / {
        rescrie ^ https://$host:8443$request_uri?;
    }
}
Server {
    asculta 8443 ssl http2;
        asculta [::]:8443 ssl http2;

    nume_server example.com;

    server_tokens dezactivat;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_buffer_size 8k;

    ssl_dhparam /etc/ssl/certs/dhparam-2048.pem;

    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_prefer_server_ciphers activat;

    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

    ssl_ecdh_curve secp384r1;
    ssl_session_tickets off;

    ssl_capsare activată;
    ssl_stapling_verify on;
    resolver 1.1.1.1 1.0.0.1 208.67.222.222 208.67.220.220;


    Locație / {

        add_header „Acces-Control-Allow-Origin” „*”;
    add_header 'Acces-Control-Allow-Credentials' 'true';
    add_header 'Acces-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Acces-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';



        proxy_pass https://unifi:8443/;
        proxy_set_header Autorizare „”;
        proxy_pass_request_headers activat;
        proxy_set_header Gazdă $gazdă;
        proxy_set_header X-Real-IP $adresă_la distanță;
        proxy_set_header X-Forwarded-Host $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $schema;
        proxy_set_header X-Forwarded-Ssl activat;
        proxy_http_versiunea 1.1;
        proxy_buffering dezactivat;
        proxy_redirect dezactivat;
        proxy_set_header Actualizare $http_upgrade;
        proxy_set_header Conexiune „Actualizare”;
        auth_basic „Restricționat”;
        proxy_set_header Referer „”;

    }
}

Am obosit să caut mai multe ghiduri pe și în afara Stack Exchange decât le-am putut urmări, de aceea configurația mea este acum atât de dezordonată.

Deci, cum modific Nginx pentru a servi cererile XHR fără a eșua din cauza CORS?

Editare 1: Am adăugat portul 443 la porturile de ascultare Nginx alături de 8443. Dacă accesez Unifi peste 443 și îl proxy la unifi:8443, funcționează conform așteptărilor. Dar, am nevoie să funcționeze transparent pe 8443.

Editarea 2: Am încercat să adaug un alt container Nginx „de mijloc” cu o configurație ușor modificată.Am trimis cererile către portul 8443 de pe containerul original Nginx către cel de-al doilea container de pe portul 443 și le-am proxy invers către Unifi pe 8443. Același rezultat ca și când nu aveam proxy-ul „om în mijloc” ca înainte. Deci Web -> Nginx pe 8443 --> Nginx pe 443 -> Unfi pe 8443. Am eliminat această configurație deoarece nu a funcționat, plus că este ineficientă.

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.