ฉันกำลังพยายามตั้งค่าสแต็กของบริการใน Docker: Unifi, PHP, Nginx และ Certbot โดยที่ Unifi และ PHP เป็นบริการแบ็กเอนด์ และ Nginx ให้บริการในโหมดพร็อกซีย้อนกลับ ในขณะที่ Certbot ทำงานเป็นระยะเพื่อรับใบรับรอง SSL สำหรับ Nginx .
ฉันใช้งานได้เป็นส่วนใหญ่ คำขอ GET ทั้งหมดใช้งานได้ และฉันสามารถดูหน้าที่ Unifi ให้บริการได้ อย่างไรก็ตาม คำขอ POST ใดๆ และทั้งหมดผ่าน AJAX ล้วนมีข้อผิดพลาด 403 เนื่องจาก CORS
ตอนนี้ฉันไม่คุ้นเคยกับวิธีจัดการส่วนหัวของ CORS หรือสิ่งที่ทำให้เกิดข้อผิดพลาด เป็นเบราว์เซอร์ Nginx หรือ Unifi? แม้ว่า Nginx คือทั้งหมดที่ฉันสามารถเปลี่ยนการกำหนดค่าได้
นี่คือข้อผิดพลาดที่ฉันได้รับจากคำขอโพสต์ AJAX ทั้งหมด จากตัวตรวจสอบเบราว์เซอร์/ตัวตรวจสอบเครือข่าย:
โพสต์
แบบแผน https
โฮสต์ example.com:8443
ชื่อไฟล์ /api/stat/device
ที่อยู่ (เซิร์ฟเวอร์_ip_ที่อยู่):8443
สถานะ 403 ต้องห้าม
เวอร์ชัน HTTP/2
โอนแล้ว 141 B (ขนาด 0 B)
นโยบายผู้อ้างอิงที่เข้มงวด-ต้นทาง-เมื่อ-ข้าม-ต้นทาง
ส่วนหัวของการตอบสนอง
ความยาวเนื้อหา 0
ข้อความประเภทเนื้อหา/ธรรมดา
วันที่ ศ. 17 ก.ย. 2564 00:59:09 น. GMT
เซิร์ฟเวอร์ nginx
X-Firefox-Spdy h2
ขอส่วนหัว
ยอมรับแอปพลิเคชัน/json, ข้อความ/ธรรมดา, */*
ยอมรับการเข้ารหัส gzip, deflate, br
ยอมรับภาษา en-US,en;q=0.5
การเชื่อมต่อมีชีวิตอยู่
ความยาวเนื้อหา 0
Cookie unifises=(สุ่มโทเค็นที่นี่); csrf_token=(สุ่มโทเค็นที่นี่)
ดีเอ็นที 1
โฮสต์ example.com:8443
ต้นทาง https://example.com:8443
ผู้อ้างอิง https://example.com:8443/setup/configure/controller-name
Sec-Fetch-Dest ว่างเปล่า
วินาที-Fetch-Mode cors
Sec-Fetch-Site แหล่งกำเนิดเดียวกัน
รถพ่วง TE
User-Agent Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
X-Csrf-Token (โทเค็นสุ่มที่นี่)
นี่คือการกำหนดค่า Nginx:
# เปิดใช้งานการบีบอัด GZIP
เปิด gzip;
# ระดับการบีบอัด (1-9)
# 6 เป็นการประนีประนอมที่ดีระหว่างการใช้งาน CPU และขนาดไฟล์
gzip_comp_level 6;
# ขีด จำกัด ขนาดไฟล์ขั้นต่ำเป็นไบต์เพื่อหลีกเลี่ยงการบีบอัดเชิงลบ
gzip_min_length 256;
# บีบอัดข้อมูลสำหรับลูกค้าที่เชื่อมต่อผ่านพรอกซี
gzip_proxyed ใด ๆ ;
# กำหนดให้ผู้รับมอบฉันทะแคชเนื้อหาทั้งเวอร์ชันปกติและ GZIp
gzip_vary บน;
# ปิดใช้งานการบีบอัด GZIP สำหรับเบราว์เซอร์โบราณ
gzip_disable "msie6";
เซิร์ฟเวอร์ {
ฟัง 80;
ฟัง [::]:80;
server_name example.com;
ตำแหน่ง ~ /.well-known/acme-challenge {
อนุญาตทั้งหมด
รูท /var/www/certbot/;
}
# เปลี่ยนเส้นทางเส้นทาง Unifi ที่เกี่ยวข้องที่อยู่ Unifi และพอร์ต
ที่ตั้ง / {
เขียนใหม่ ^ https://$host:8443$request_uri?;
}
}
เซิร์ฟเวอร์ {
ฟัง 8443 ssl http2;
ฟัง [::]:8443 ssl http2;
server_name example.com;
ปิด server_tokens;
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;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
ssl_ecdh_curve secp384r1;
ปิด ssl_session_tickets;
เปิด ssl_stapling;
เปิด ssl_stapling_verify;
ตัวแก้ไข 1.1.1.1 1.0.0.1 208.67.222.222 208.67.220.220;
ที่ตั้ง / {
add_header 'การควบคุมการเข้าถึง - อนุญาต - ต้นทาง' '*';
add_header 'Access-Control-Allow-Credentials' 'จริง';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-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 การอนุญาต "";
เปิด proxy_pass_request_headers;
proxy_set_header โฮสต์ $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-ส่งต่อโฮสต์ $remote_addr;
proxy_set_header X-ส่งต่อ-สำหรับ $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header เปิด X-Forwarded-Ssl;
proxy_http_version 1.1;
ปิด proxy_buffering;
ปิด proxy_redirect;
proxy_set_header อัพเกรด $http_upgrade;
proxy_set_header การเชื่อมต่อ "อัพเกรด";
auth_basic "ถูกจำกัด";
proxy_set_header ผู้อ้างอิง "";
}
}
ฉันเบื่อที่จะมองหาคำแนะนำทั้งในและนอก Stack Exchange มากกว่าที่ฉันจะติดตามได้ ด้วยเหตุนี้ทำไมการกำหนดค่าของฉันจึงยุ่งเหยิง
ดังนั้นฉันจะแก้ไข Nginx เพื่อตอบสนองคำขอ XHR โดยไม่ล้มเหลวเนื่องจาก CORS ได้อย่างไร
แก้ไข 1: ฉันเพิ่มพอร์ต 443 เข้ากับพอร์ตฟัง Nginx ข้าง 8443 หากฉันเข้าถึง Unifi มากกว่า 443 และพร็อกซีไปยัง unifi:8443 จะทำงานตามที่คาดไว้ แต่ฉันต้องการให้มันทำงานอย่างโปร่งใสบน 8443
แก้ไข 2: ฉันลองเพิ่มคอนเทนเนอร์ Nginx "คนกลาง" อื่นด้วยการกำหนดค่าที่แก้ไขเล็กน้อยฉันส่งคำขอพร็อกซีไปยังพอร์ต 8443 บนคอนเทนเนอร์ Nginx ดั้งเดิมไปยังคอนเทนเนอร์ที่สองบนพอร์ต 443 และย้อนกลับพร็อกซีนั้นไปยัง Unifi บน 8443 ผลลัพธ์เหมือนกับที่ไม่มีพร็อกซี "คนอยู่ตรงกลาง" เหมือนเมื่อก่อน ดังนั้น Web -> Nginx บน 8443 --> Nginx บน 443 -> Unfi บน 8443 ลบการกำหนดค่านี้เนื่องจากใช้งานไม่ได้ แถมยังไม่มีประสิทธิภาพอีกด้วย