Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah saya masih mendapat ralat \"Access-Control-Allow-Origin\" apabila saya telah menetapkan pengepala CORS dalam PHP?

Mengapakah saya masih mendapat ralat \"Access-Control-Allow-Origin\" apabila saya telah menetapkan pengepala CORS dalam PHP?

Linda Hamilton
Linda Hamiltonasal
2024-11-03 02:22:03626semak imbas

Why am I still getting an

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn