Score:0

บางสิ่งในการกำหนดค่า Nginx ของฉันบอกเป็นนัยได้หรือไม่ว่าทำไมแบ็กเอนด์ของฉันไม่ส่งส่วนหัว 'Access-Control-Allow-Origin' ในคำขอ POST

ธง in

* แก้ไข 1: ข้อผิดพลาดดูเหมือนจะเป็นเฉพาะกับ โพสต์ คำขอ

ฉันมีเว็บไซต์ส่วนหน้าบน โลคัลโฮสต์. มีการลงทะเบียนหน้าบน localhost/register

เว็บไซต์เรียกฟังก์ชันแบ็กเอนด์เพื่อลงทะเบียนผู้ใช้ที่ localhost:8080/api/register

ฉันใช้ Axios เพื่อโพสต์ชื่อผู้ใช้และรหัสผ่าน เบราว์เซอร์ส่งคำขอสองรายการ: คำขอก่อนบิน OPTIONS และคำขอ POST

สร้างผู้ใช้สำเร็จแล้ว แต่เบราว์เซอร์แสดงข้อผิดพลาดสำหรับคำขอ POST:

เหตุผล: ไม่มีส่วนหัว CORS âAccess-Control-Allow-Originâ

และแน่นอนว่ามันขาดหายไปในการตอบกลับ POST สมมติว่าไฟล์ cors ส่วนหลังของฉันได้รับการกำหนดค่าอย่างถูกต้อง ปัญหาอาจมาจากการรวมกันของการตั้งค่า Docker + Nginx ของฉันที่บล็อกหรือพร็อกซีส่วนหัวไปยังตำแหน่งที่ไม่ถูกต้อง

นี่คือการกำหนดค่า nginx ของฉัน:

เซิร์ฟเวอร์ {
    ฟัง 8080;
    ดัชนี index.php index.html;    
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    รูท /var/www/html/public;
    
    ที่ตั้ง / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    
    ตำแหน่ง ~ \.php$ {        
        try_files $uri = 404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        รวม fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    
}

  เซิร์ฟเวอร์ {    
    ฟัง 80;       
      ที่ตั้ง / {      
      proxy_pass http://node:3000;
      
    }
  }

และนี่คือของฉัน นักเทียบท่า-compose.yml:

เครือข่าย:
    เครือข่ายของฉัน:
        คนขับ: สะพาน

บริการ:
    จิงซ์:
        รูปภาพ: nginx:stable-alpine
        ชื่อคอนเทนเนอร์: nginx
        พอร์ต:
            - "8080:8080"
            - "80:80"            
        ปริมาณ:            
            - ./php:/var/www/html 
            - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
            
        ขึ้นอยู่กับ:
            - php
            - โหนด
        เครือข่าย:
            - เครือข่ายของฉัน
    
    php:        
        สร้าง:
            บริบท: ./php
            นักเทียบท่าไฟล์: Dockerfile
        ชื่อคอนเทนเนอร์: php.ini
        ผู้ใช้: "1,000:1,000"
        ปริมาณ:
            - ./php:/var/www/html
        พอร์ต:
            - "9000:9000"
        เครือข่าย:
            - มายเน็ทเวิร์ค

    โหนด:
        สร้าง:
            บริบท: ./react
            นักเทียบท่าไฟล์: Dockerfile
        container_name: ถัดไป        
        ปริมาณ:
            - ./react:/var/www/html                
        พอร์ต:
            - "3000:3000"       

        เครือข่าย:
            - มายเน็ทเวิร์ค


           

** แก้ไข 2:

แบ็กเอนด์คือ Laravel และมีมิดเดิลแวร์ CORS ที่ควรจะดูแล และในความเป็นจริงดูเหมือนว่าจะใช้งานได้เพราะ รับ และ ตัวเลือก ขอผ่านโดยไม่มีข้อผิดพลาดเท่านั้น โพสต์ คำขอแสดงข้อผิดพลาดนี้

นี่คือไฟล์กำหนดค่า CORS (cors.php) ใน Laravel:

'เส้นทาง' => ['api/*', 'sanctum/csrf-cookie'],

'allowed_methods' => ['*'],

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

'allowed_origins_patterns' => ['*'],

'allowed_headers' => ['*'],

'exposed_headers' => [],

'max_age' => 0,

'supports_credentials' => จริง
us flag
ไม่มีสิ่งใดในการกำหนดค่านี้ที่จะเพิ่มส่วนหัว CORS คุณต้องดูแลมัน
Stackerito avatar
in flag
ขอขอบคุณ. คุณพูดถูกที่ nginx ไม่มีอะไรเลย แต่แบ็กเอนด์มีมิดเดิลแวร์ที่ดูแลเรื่องนั้น และในความเป็นจริงเมื่อฉันส่งคำขอ 'GET' และ 'OPTIONS' มันจะส่งส่วนหัวที่ถูกต้อง แต่กับ `POST` ไม่ใช่ อย่างที่คุณพูด เพื่อแก้ไขปัญหาคำขอ `POST` ฉันได้เพิ่มสิ่งต่อไปนี้ในบล็อกเซิร์ฟเวอร์ PHP และตอนนี้ใช้งานได้แล้ว: `ถ้า ( $request_method = POST ){ add_header 'Access-Control-Allow-Origin' 'http://localhost'; add_header 'Access-Control-Allow-Credentials' 'จริง'; }`. แต่ทำไมฉันไม่ต้องการสิ่งนั้นสำหรับ `GET` และ `OPTIONS` เพิ่มรหัสส่วนหลัง
us flag
เราสามารถเดาได้ว่ากระบวนการคิดของผู้พัฒนามิดเดิลแวร์เป็นอย่างไรเมื่อพวกเขานำไปใช้
Stackerito avatar
in flag
ตอนนี้ฉันควรเก็บรหัสของฉันไว้ในบล็อกเซิร์ฟเวอร์สำหรับคำขอ `POST` หรือไม่ การกำหนดค่าใหม่ของฉันดูเหมือนจะโอเคสำหรับคุณหรือไม่ หรือฉันขาดบางอย่างที่อาจทำให้เกิดปัญหา (มันใช้งานได้ แต่บางทีฉันสามารถทำให้ดีขึ้นได้)
us flag
ใช่ บล็อก `เซิร์ฟเวอร์` นั้นใช้ได้ อย่างไรก็ตาม แนวทางปฏิบัติที่ดีที่สุดคือการย้อนกลับเส้นทางพร็อกซีไปยัง URL แบ็กเอนด์แทนการใช้พอร์ตอื่นสำหรับการเข้าถึงแบ็คเอนด์ที่แตกต่างกัน
Stackerito avatar
in flag
คุณช่วยอธิบายวิธีเปลี่ยนการกำหนดค่าปัจจุบันให้ฉันได้ไหม ฉันคิดว่านั่นคือสิ่งที่ฉันกำลังทำอยู่แล้วโดยการพร็อกซีไปยังแบ็กเอนด์ของฉันที่พอร์ต 8080
us flag
คำว่าพร็อกซีย้อนกลับด้านบนไม่ถูกต้องจริง คุณต้องทำบล็อก "ตำแหน่ง /api" ภายในบล็อก "เซิร์ฟเวอร์" ที่มีพอร์ต 80 จากนั้นย้ายการกำหนดค่าสำหรับพอร์ต 8000 ภายใต้ส่วนนั้น นั่นคือ คุณควรให้บริการแบ็กเอนด์ผ่านพอร์ต 80 ด้วย เพียงใช้คำนำหน้าอื่น
Stackerito avatar
in flag
ฉันทำสิ่งที่ต่างออกไปเล็กน้อย: ฉันใช้โดเมนย่อยแทนเส้นทาง `/api` วิธีที่ฉันทำคือเพิ่ม `api.mysite.local` ลงในไฟล์ `hosts` ก่อน แล้วจึงเพิ่มบล็อกเซิร์ฟเวอร์ที่ฟังพอร์ต `80` และเปลี่ยนเส้นทางคำขอไปยังบล็อกเซิร์ฟเวอร์ที่ฟังบนพอร์ต `8080` เช่น ดังนั้น: `return 301 https://api.mysite.local$request_uri;` - นี่เป็นแนวปฏิบัติที่ดีหรือไม่
Michael Hampton avatar
cz flag
ดูเหมือนว่าปัญหาเกี่ยวกับ Laravel มากกว่าการกำหนดค่า nginx ของคุณ คุณได้ขอความช่วยเหลือเกี่ยวกับ [ดังนั้น] หรือไม่? คุณอาจต้องการทำเช่นนั้น

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา