ใช้งาน https://github.com/fruitcake/php-cors สำหรับ Laravel
ตั้งแต่ Laravel 9.2 มิดเดิลแวร์นี้จะรวมอยู่ใน laravel/framework คุณสามารถใช้มิดเดิลแวร์ที่ให้มาได้ ซึ่งควรเข้ากันได้กับมิดเดิลแวร์และการกำหนดค่าที่ให้ไว้ในแพ็คเกจนี้ ดูhttps://github.com/laravel/laravel/pull/5825/filesสำหรับการเปลี่ยนแปลง
ขั้นตอนในการอัพเกรด:
ลบ "fruitcake/laravel-cors"
ออกจาก composer.json ของคุณ
แทนที่ FruitcakeCorsHandleCors::class,
ด้วย IlluminateHttpMiddlewareHandleCors::class,
ใน app/Http/Kernel.php
ดู https://github.com/fruitcake/php-cors
สำหรับการใช้งานขั้นสูง การกำหนดค่ายังคงเหมือนเดิม
แพ็คเกจ laravel-cors
ช่วยให้คุณสามารถส่งส่วนหัวการแชร์ทรัพยากรข้ามแหล่งกำเนิดด้วยการกำหนดค่ามิดเดิลแวร์ Laravel
หากคุณต้องการดูภาพรวมโดยรวมของเวิร์กโฟลว์ CORS คุณสามารถเรียกดูรูปภาพนี้ได้
เมื่ออัปเกรดจากเวอร์ชัน 0.x มีการเปลี่ยนแปลงที่สำคัญบางประการ:
คุณสมบัติ 'เส้นทาง' ใหม่ถูกใช้เพื่อเปิด/ปิดการใช้งาน CORS ในบางเส้นทาง ค่านี้ว่างเปล่าโดยค่าเริ่มต้น ดังนั้นให้กรอกให้ถูกต้อง!
ไม่รองรับมิดเดิลแวร์กลุ่มอีกต่อไป โปรดใช้มิดเดิลแวร์ส่วนกลาง
ชื่อผู้จำหน่ายมีการเปลี่ยนแปลง (ดูการติดตั้ง/การใช้งาน)
เคสของอุปกรณ์ประกอบฉากใน cors.php
ได้เปลี่ยนจาก CamelCase เป็น Snake_case ดังนั้น หากคุณมีไฟล์ cors.php
อยู่แล้ว คุณจะต้องอัปเดตอุปกรณ์ประกอบฉากในนั้นเพื่อให้ตรงกับเคสใหม่
จัดการคำขอ OPTIONS ของ CORS ก่อนการบิน
เพิ่มส่วนหัว CORS ในการตอบกลับของคุณ
จับคู่เส้นทางเพื่อเพิ่ม CORS ให้กับคำขอบางรายการเท่านั้น
ต้องการแพ็คเกจ fruitcake/laravel-cors
ใน composer.json
ของคุณและอัปเดตการอ้างอิงของคุณ:
ผู้แต่งต้องการ Fruitcake/laravel-cors
หากคุณพบข้อขัดแย้ง อาจเป็นเพราะติดตั้ง barryvdh/laravel-cors หรือ Fruitcake/laravel-cors เวอร์ชันเก่ากว่า ลบแพ็คเกจที่ขัดแย้งออกก่อน จากนั้นลองติดตั้งอีกครั้ง:
ผู้แต่งลบ barryvdh/laravel-cors Fruitcake/laravel-cors ผู้แต่งต้องการ Fruitcake/laravel-cors
หากต้องการอนุญาต CORS สำหรับเส้นทางทั้งหมดของคุณ ให้เพิ่มมิดเดิลแวร์ HandleCors
ที่ด้านบนของคุณสมบัติ $middleware
ของคลาส app/Http/Kernel.php
:
ป้องกัน $middleware = [ FruitcakeCorsHandleCors::class,// ...];
ตอนนี้อัปเดตการกำหนดค่าเพื่อกำหนดเส้นทางที่คุณต้องการเรียกใช้บริการ CORS (ดูการกำหนดค่าด้านล่าง):
'เส้นทาง' => ['api/*'],
ค่าเริ่มต้นถูกกำหนดไว้ใน config/cors.php
เผยแพร่การกำหนดค่าเพื่อคัดลอกไฟล์ไปยังการกำหนดค่าของคุณเอง:
ผู้ขาย php ช่างฝีมือ: เผยแพร่ --tag = "cors"
หมายเหตุ: เมื่อใช้ส่วนหัวที่กำหนดเอง เช่น
X-Auth-Token
หรือX-Requested-With
คุณต้องตั้งallowed_headers
ให้รวมส่วนหัวเหล่านั้นด้วย คุณยังสามารถตั้งค่าเป็น['*']
เพื่ออนุญาตส่วนหัวที่กำหนดเองทั้งหมดได้
หมายเหตุ: หากคุณกำหนดส่วนหัวไว้อย่างชัดเจน คุณต้องรวม
Origin
มิฉะนั้นคำขอจะไม่ได้รับการยอมรับว่าเป็น CORS
ตัวเลือก | คำอธิบาย | ค่าเริ่มต้น |
---|---|---|
เส้นทาง | คุณสามารถเปิดใช้งาน CORS ได้ 1 เส้นทางหรือหลายเส้นทาง เช่น ['api/*'] | [] |
อนุญาต_วิธีการ | ตรงกับวิธีการร้องขอ | ['*'] |
อนุญาต_ต้นกำเนิด | ตรงกับที่มาของคำขอ สามารถใช้ไวด์การ์ดได้ เช่น *.mydomain.com หรือ mydomain.com:* | ['*'] |
อนุญาต_ต้นกำเนิด_รูปแบบ | จับคู่ที่มาของคำขอด้วย preg_match | [] |
อนุญาต_headers | ตั้งค่าส่วนหัวการตอบสนอง Access-Control-Allow-Headers | ['*'] |
เปิดเผย_headers | ตั้งค่าส่วนหัวการตอบสนอง Access-Control-Expose-Headers | [] |
สูงสุด_อายุ | ตั้งค่าส่วนหัวการตอบสนอง Access-Control-Max-Age | 0 |
support_credentials | ตั้งค่าส่วนหัว Access-Control-Allow-Credentials | false |
allowed_origins
, allowed_headers
และ allowed_methods
สามารถตั้งค่าเป็น ['*']
เพื่อยอมรับค่าใดก็ได้
หมายเหตุ: สำหรับ
allowed_origins
คุณต้องรวมรูปแบบเมื่อไม่ได้ใช้ไวด์การ์ด เช่น['http://example.com', 'https://example.com']
คุณต้องคำนึงด้วยว่าจะมีรูปแบบนี้เมื่อใช้allowed_origins_patterns
หมายเหตุ: พยายามระบุให้เฉพาะเจาะจงมากที่สุด คุณสามารถเริ่มต้นพัฒนาโดยมีข้อจำกัดที่หลวมๆ ได้ แต่จะดีกว่าถ้าเข้มงวดที่สุด!
หมายเหตุ: เนื่องจากวิธีการ http แทนที่ใน Laravel การอนุญาตให้ใช้วิธี POST จะช่วยให้ผู้ใช้ API สามารถดำเนินการคำขอ PUT และ DELETE ได้เช่นกัน
หมายเหตุ: บางครั้งจำเป็นต้องระบุพอร์ต (เช่น เมื่อคุณเขียนโค้ดแอปในสภาพแวดล้อมท้องถิ่น) คุณสามารถระบุพอร์ตหรือใช้ไวด์การ์ดได้ที่นี่เช่นกัน เช่น
localhost:3000
,localhost:*
หรือแม้แต่ใช้ FQDNapp.mydomain.com:8080
บน Lumen เพียงลงทะเบียน ServiceProvider ด้วยตนเองในไฟล์ bootstrap/app.php
ของคุณ:
$app->ลงทะเบียน(FruitcakeCorsCorsServiceProvider::class);
คัดลอกไฟล์กำหนดค่า cors.php ไปที่ config/cors.php
และนำไปใช้จริง:
$app->configure('cors');
หากต้องการอนุญาต CORS สำหรับเส้นทางทั้งหมดของคุณ ให้เพิ่มมิดเดิลแวร์ HandleCors
ให้กับมิดเดิลแวร์ส่วนกลางและตั้งค่าคุณสมบัติ paths
ในการกำหนดค่า
$app->มิดเดิลแวร์([// ...FruitcakeCorsHandleCors::class, -
ตรวจสอบให้แน่ใจว่าตัวเลือก path
ในการกำหนดค่าถูกต้องและตรงกับเส้นทางที่คุณใช้อยู่ อย่าลืมล้างแคชการตั้งค่าด้วย
บางครั้งข้อผิดพลาด/มิดเดิลแวร์ที่ส่งคืนการตอบสนองของตัวเองอาจทำให้ CORS Middleware ไม่สามารถรันได้ ลองเปลี่ยนลำดับของมิดเดิลแวร์ และตรวจสอบให้แน่ใจว่าเป็นรายการแรกในมิดเดิลแวร์ส่วนกลาง ไม่ใช่กลุ่มเส้นทาง ตรวจสอบบันทึกของคุณเพื่อดูข้อผิดพลาดจริงด้วย เนื่องจากหากไม่มี CORS เบราว์เซอร์จะกลืนข้อผิดพลาด โดยจะแสดงเฉพาะข้อผิดพลาด CORS เท่านั้น ลองรันโดยไม่ใช้ CORS เพื่อให้แน่ใจว่าใช้งานได้จริง
หากคำขอของคุณมีส่วนหัวการให้สิทธิ์หรือใช้โหมดข้อมูลรับรอง ให้ตั้งค่า supports_credentials
ในการกำหนดค่าให้เป็นจริง สิ่งนี้จะตั้งค่าส่วนหัว Access-Control-Allow-Credentials เป็น true
หากคุณใช้ echo()
, dd()
, die()
, exit()
, dump()
ฯลฯ ในโค้ดของคุณ คุณจะทำลายโฟลว์มิดเดิลแวร์ เมื่อเอาต์พุตถูกส่งก่อนส่วนหัว จะไม่สามารถเพิ่ม CORS ได้ เมื่อสคริปต์ออกก่อนที่มิดเดิลแวร์ CORS จะเสร็จสิ้น ส่วนหัว CORS จะไม่ถูกเพิ่ม ส่งคืนการตอบสนองที่เหมาะสมเสมอหรือส่งข้อยกเว้น
หากเป็นไปได้ ให้ใช้กลุ่มเส้นทางที่ปิดใช้งานการป้องกัน CSRF มิฉะนั้นคุณสามารถปิดการใช้งาน CSRF สำหรับคำขอบางรายการใน AppHttpMiddlewareVerifyCsrfToken
:
ป้องกัน $ยกเว้น = ['api/*','sub.domain.zone' => [ 'คำนำหน้า/*'], -
CORS Middleware ควรเป็นที่เดียวที่คุณเพิ่มส่วนหัวเหล่านี้ หากคุณเพิ่มส่วนหัวใน .htaccess, nginx หรือไฟล์ index.php ของคุณ คุณจะได้รับส่วนหัวที่ซ้ำกันและผลลัพธ์ที่ไม่คาดคิด
หากคุณไม่ได้ส่งคำขอข้ามไซต์ ซึ่งหมายความว่าหากคุณไม่ได้ร้องขอ site-a.com/api จาก site-b.com เบราว์เซอร์ของคุณจะไม่ส่งส่วนหัวคำขอ Origin: https://site-b.com
CORS จะถูก "ปิดใช้งาน" เนื่องจากส่วนหัว Access-Control-Allow-Origin
จะหายไปด้วย สิ่งนี้เกิดขึ้นเนื่องจากมีการส่งคำขอจากที่เดียวกันและไม่จำเป็นต้องมีการป้องกันในกรณีนี้
เผยแพร่ภายใต้ใบอนุญาต MIT ดูใบอนุญาต