CORS: PHP: Respons kepada permintaan prapenerbangan gagal. Saya benarkan asal
P粉642920522
2023-08-24 18:24:56
<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>
Dalam kes serupa saya, bahagian hadapan Angular dan bahagian belakang Php membantu dengan kod di bawah. Mula-mula saya menghantar tajuk:
Selepas mereka saya boleh mengabaikan permintaan pilihan:
Pendekatan ini membantu saya mengendalikan kaedah permintaan terbenam "siaran" dan "padam" dalam Angular.
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:
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