CORS: PHP: Respons kepada permintaan prapenerbangan gagal. Saya benarkan asal
P粉642920522
P粉642920522 2023-08-24 18:24:56
0
2
672
<p>Jadi, saya tahu terdapat banyak siaran CORS di luar sana dan saya hanya menambahnya tetapi saya tidak menemui sebarang jawapan yang boleh membantu saya. Jadi saya sedang membina aplikasi Angular 4 yang bergantung pada api php saya. Berfungsi secara tempatan tiada masalah, apabila saya membuangnya pada domain dengan apl di <code>app.example.com</code> dan api di <code>api.example.com</code> lulus log masuk saya kerana saya mendapat ralat berikut: </p> <blockquote> <p>XMLHttpRequest tidak boleh memuatkan http://api.example.com/Account/Login. Respons kepada permintaan prapenerbangan gagal semakan kawalan akses: Tidak Pengepala 'Access-Control-Allow-Origin' hadir dalam permintaan sumber. Jadi sumber "http://app.example.com" tidak dibenarkan akses.</p> </blockquote> <p>我的 php 代码如下所示:</p> <pre class="brush:php;toolbar:false;">$http_origin = $_SERVER['HTTP_ORIGIN']; $allowed_domains = tatasusunan( 'http://example.com', 'https://example.com', 'http://app.example.com', 'https://app.example.com', 'http://www.example.com', 'https://www.example.com' ); if (in_array(strtolower($http_origin), $allowed_domains)) { // header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Origin: $http_origin"); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Max-Age: 86400'); } // Pengepala Access-Control diterima semasa permintaan OPTIONS jika ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); header("Access-Control-Allow-Headers: Kebenaran, Jenis Kandungan, Terima, Asal"); keluar(0); }</pre> <p>我的 Angular 帖子如下所示:</p> <pre class="brush:php;toolbar:false;">log masuk awam(log masuk: Log masuk): Boleh diperhatikan<LoginResponse> { let header = new Headers(); headers.append('Content-Type', 'application/x-www-form-urlencoded'); headers.append('Kebenaran', 'Asas' + btoa(log masuk.Nama Pengguna + ':' + log masuk.Kata Laluan)); kembalikan this.http.post(this.apiBaseUrl + '/Account/Login', "grant_type=client_credentials", { headers: headers }) .map(respon => { // kod }); }</pre> <p>如果我通过邮递员运行请求(这不会影响 CORS),我会得到:</p> <pre class="brush:php;toolbar:false;">{ "error": "invalid_client", "error_description": "Kelayakan pelanggan tidak ditemui dalam pengepala atau badan" }</pre> <p>我尝试将 asal 设置为 '<kod>*</kod>' 只是为了测试并查看这是否是问题的核心,但它仍然以同样的方式失败。</p> <p><strong><em>编辑</em></strong> 只是根据以下信息进行更新。更改标头中的大小写没有任何效果,并且从并且从家任何效果。</p> <p>我通过告诉我的实时应用程序转到本地 api 来调试 php,并且 php 正在按预期彮你。其放入每个 jika 语句中。</p> <p><strong><em>编辑镜头 2</em></strong> 我确实需要一些帮助,如果有人有任何想法,我将非常感激。</p> <p><strong><em>Edit Tangkapan 3</em></strong> Jika saya menetapkan semua bahan pengepala dalam .htaccess dan bukannya php ia membenarkan saya lulus. Namun, kini saya terperangkap dengan ralat yang disenaraikan di atas, iaitu ralat yang selalu saya dapat apabila menggunakan Posmen, tetapi sekarang apabila menggunakan laman web sebenar. </p> <p><kod>{"error":"invalid_client","error_description":"Bukti kelayakan pelanggan tidak ditemui dalam pengepala atau badan"}</code></p> <p>Pengepala respons saya kelihatan seperti ini</p> <pre class="brush:php;toolbar:false;">Access-Control-Allow-Credentials:true Access-Control-Allow-Headers:keizinan, jenis kandungan, terima, asal Access-Control-Allow-Methods:GET, POST, OPTIONS Access-Control-Allow-Origin:*</pre> <p>Sebaik sahaja ia berfungsi, saya akan menukarnya daripada * kepada domain saya sahaja. Tetapi sekarang saya meninggalkannya sebagai *. </p> <p><strong>Tajuk saya atas permintaan. </strong></p>
P粉642920522
P粉642920522

membalas semua(2)
P粉502608799

Dalam kes serupa saya, bahagian hadapan Angular dan bahagian belakang Php membantu dengan kod di bawah. Mula-mula saya menghantar tajuk:

header("Access-Control-Allow-Origin: http://localhost:4200");   
header("Content-Type: application/json; charset=UTF-8");    
header("Access-Control-Allow-Methods: POST, DELETE, OPTIONS");    
header("Access-Control-Max-Age: 3600");    
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

Selepas mereka saya boleh mengabaikan permintaan pilihan:

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {    
   return 0;    
}

Pendekatan ini membantu saya mengendalikan kaedah permintaan terbenam "siaran" dan "padam" dalam Angular.

P粉316890884

Baiklah, saya mengalami masalah yang sama baru-baru ini dan saya menyelesaikan semuanya di bahagian belakang sahaja, tanpa bahan .htaccess.

Apabila penyemak imbas menghantar permintaan silang pelayan, ia mula-mula menghantar permintaan OPTIONS untuk memastikan ia sah dan permintaan "sebenar" boleh dihantar. Permintaan "sebenar" dihantar apabila ia mendapat respons yang betul dan sah daripada OPTIONS.

Kini, untuk kedua-dua permintaan di bahagian belakang, anda perlu memastikan pengepala yang betul dikembalikan: jenis kandungan, benarkan asal, benarkan pengepala, dll...

Pastikan bahawa dalam permintaan OPTIONS pada bahagian belakang, aplikasi mengembalikan pengepala dan mengembalikan respons dan bukannya meneruskan aliran penuh aplikasi.

Dalam permintaan "sebenar" anda harus mengembalikan pengepala yang betul dan badan respons biasa.

Contoh:

//The Response object
    $res = $app->response;

    $res->headers->set('Content-Type', 'application/json');
    $res->headers->set('Access-Control-Allow-Origin', 'http://example.com');
    $res->headers->set('Access-Control-Allow-Credentials', 'true');
    $res->headers->set('Access-Control-Max-Age', '60');
    $res->headers->set('Access-Control-Allow-Headers', 'AccountKey,x-requested-with, Content-Type, origin, authorization, accept, client-security-token, host, date, cookie, cookie2');
    $res->headers->set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');

    if ( ! $req->isOptions()) {
        // this continues the normal flow of the app, and will return the proper body
        $this->next->call();
    } else {
        //stops the app, and sends the response
        return $res;
    }

Perkara yang perlu diingat:

  • Jika anda menggunakan: "Access-Control-Allow-Credentials" = benar Pastikan "Access-Control-Allow-Origin" bukan "*", ia mesti ditetapkan kepada domain yang betul! (Banyak darah tumpah kat sini :/)

  • Tentukan pengepala benarkan yang anda akan dapat dalam "Kawalan-Akses-Benarkan-Pengepala" Jika anda tidak mentakrifkannya, permintaan akan gagal

  • Jika anda menggunakan "Kebenaran: Pembawa", maka "Kawalan-Kawalan-Benarkan-Kepala" juga harus mengandungi "Kebenaran", jika tidak, permintaan akan gagal
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan