CORS Tidak Berfungsi dalam PHP
Cross-Origin Resource Sharing (CORS) membolehkan anda membuat permintaan daripada satu domain ke domain lain. Apabila permintaan dibuat daripada domain lain, penyemak imbas menyemak respons pelayan untuk pengepala tertentu yang menunjukkan sama ada permintaan itu dibenarkan.
Masalah:
Seorang pembangun sedang cuba menghantar permintaan POST daripada www.siteone.com ke www.sitetwo.com menggunakan CORS. Walau bagaimanapun, mereka menghadapi "ralat Access-control-Allow-Origin" walaupun menetapkan pengepala CORS yang diperlukan pada pelayan.
Tajuk Permintaan/Respons:
Response Headers Connection Keep-Alive Content-Length 487 Content-Type text/html; charset=iso-8859-1 Date Fri, 23 Aug 2013 05:53:20 GMT Keep-Alive timeout=15, max=99 Server Apache/2.2.15 (CentOS) WWW-Authenticate Basic realm="Site two Server - Restricted Area" Request Headers Accept */* Accept-Encoding gzip, deflate Accept-Language en-US,en;q=0.5 Content-Length 43 Content-Type application/x-www-form-urlencoded; charset=UTF-8 Host www.sitetwo.com Origin http://www.siteone.com Referer http://www.siteone.com/index.html User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0
Penyelesaian:
Isunya terletak pada cara pengepala CORS ditetapkan pada pelayan. Kod asal menggunakan pendekatan ringkas yang hanya memasukkan pengepala berikut:
header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
Walau bagaimanapun, mengikut spesifikasi CORS, pengendalian permintaan dengan betul memerlukan pendekatan yang lebih komprehensif. Pembangun mengemas kini kod kepada yang berikut:
if (isset($_SERVER['HTTP_ORIGIN'])) { header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Max-Age: 86400'); // cache for 1 day } if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); exit(0); } // Your actual code goes here echo "You have CORS!";
Kod yang dikemas kini ini bukan sahaja menetapkan pengepala CORS asas, tetapi juga mengendalikan permintaan OPTIONS prapenerbangan, yang digunakan oleh penyemak imbas untuk menentukan sama ada permintaan sebenar dibenarkan. Dengan melaksanakan pendekatan yang lebih teliti ini, pembangun berjaya mendayakan CORS untuk aplikasi mereka.
Atas ialah kandungan terperinci Mengapakah saya masih mendapat ralat \'Access-Control-Allow-Origin\' apabila saya telah menetapkan pengepala CORS dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!