PHP üstbilgili Cross-Origin İstek Üstbilgileri (CORS)


146

Bir etki alanları arası CORS isteği çalışıyorum basit bir PHP komut dosyası var:

<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
...

Yine de hatayı alıyorum:

İstek başlığı alanına X-Requested-Withizin verilmiyorAccess-Control-Allow-Headers

Eksik olduğum bir şey var mı?

Yanıtlar:


59

Access-Control-Allow-Headersizin vermez *kabul değer olarak, Mozilla belgelerine bakın burada .

Yıldız işareti yerine, kabul edilen üstbilgileri göndermelisiniz (önce X-Requested-Withhatanın söylediği gibi).


289

CORS taleplerinin doğru bir şekilde ele alınması biraz daha kapsamlıdır. İşte daha eksiksiz (ve düzgün) yanıt verecek bir işlev.

/**
 *  An example CORS-compliant method.  It will allow any GET, POST, or OPTIONS requests from any
 *  origin.
 *
 *  In a production environment, you probably want to be more restrictive, but this gives you
 *  the general idea of what is involved.  For the nitty-gritty low-down, read:
 *
 *  - https://developer.mozilla.org/en/HTTP_access_control
 *  - http://www.w3.org/TR/cors/
 *
 */
function cors() {

    // Allow from any origin
    if (isset($_SERVER['HTTP_ORIGIN'])) {
        // Decide if the origin in $_SERVER['HTTP_ORIGIN'] is one
        // you want to allow, and if so:
        header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');    // cache for 1 day
    }

    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            // may also be using PUT, PATCH, HEAD etc
            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);
    }

    echo "You have CORS!";
}

32
HTTP Kökeni değerini izin verilen köken olarak geri göndermenin, herkesin size çerezlerle istek göndermesine izin vereceğini ve böylece sitenize giriş yapmış ve ardından bir saldırganın sayfasını görüntüleyen bir kullanıcının oturumunu çalabileceğini unutmayın. Ya '*' (çerezlere izin vermeyecek ve böylece oturum çalmayı engelleyecek) veya sitenin çalışmasını istediğiniz belirli alanları göndermek istiyorsunuz.
Jules

1
Kabul. Uygulamada, muhtemelen herhangi bir eski alan adının CORS hizmetinizi kullanmasına izin vermeyeceksiniz, bunu güvenmeye karar verdiğiniz bir grupla sınırlandıracaksınız.
slashingweapon

FYI, bu çözüm sadece benim için çalıştı Linux server, IISbazı nedenlerle sadece işe yaramadı, bilmiyorum onun benim hosting ya da sadece bunun için uygun değilIIS
ncubica

1
Teşekkür ederim! Bu cevaba yer işareti koymanız gerekiyor. Çok kötü bunu yeni bir cevap olarak işaretleyemeyiz
Ascherer

1
Gerçekten işe yarayan tek şey! .. Sadece Access-Control-Allow-Origin'i değiştirin: * Access-Control-Allow-Origin: {$ _SERVER ['HTTP_ORIGIN']}
Renan Franca

60

Aynı hatayı aldım ve arka uç komut dosyamda aşağıdaki PHP ile düzelttim:

header('Access-Control-Allow-Origin: *');

header('Access-Control-Allow-Methods: GET, POST');

header("Access-Control-Allow-Headers: X-Requested-With");

35

İnternet genelindeki birçok açıklama belirtmenin Access-Control-Allow-Originyeterli olmadığını belirtmemektedir . İşte benim için çalışan tam bir örnek:

<?php
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: POST, GET, DELETE, PUT, PATCH, OPTIONS');
        header('Access-Control-Allow-Headers: token, Content-Type');
        header('Access-Control-Max-Age: 1728000');
        header('Content-Length: 0');
        header('Content-Type: text/plain');
        die();
    }

    header('Access-Control-Allow-Origin: *');
    header('Content-Type: application/json');

    $ret = [
        'result' => 'OK',
    ];
    print json_encode($ret);

1
Bu yeterli değildir ve ne çok az örnek açıklamaya Lütfen olduğu yeter.
halfpastfour.am

Ne yazık ki, tam olarak hatırlamıyorum ve şimdi tekrar araştırmak için zamanım yok, ancak hatırladığım kadarıyla, web sunucusunun / tarayıcının çalışmamasını sağlayan bazı temel varsayımlar vardı. Bu benim için çalışan en az koddu.
Csongor Halmai

24

Ben sadece bu düzeltme ile çalışmak için dropzone ve diğer eklenti almayı başardım (angularjs + php backend)

 header('Access-Control-Allow-Origin: *'); 
    header("Access-Control-Allow-Credentials: true");
    header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
    header('Access-Control-Max-Age: 1000');
    header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token , Authorization');

bunu upload.php'nize veya isteğinizi göndereceğiniz yere ekleyin (örneğin upload.html dosyanız varsa ve upload.php dosyasını eklemek için dosyaları eklemeniz gerekiyorsa, bu 4 satırı kopyalayıp yapıştırın). Ayrıca, krom / mozilla'da CORS eklentilerini / eklentilerini kullanıyorsanız, CORS'ların etkinleştirilmesi için bunları bir kereden fazla değiştirdiğinizden emin olun.


15

PHP'den bir CORS hizmeti oluşturmak istiyorsanız, bu kodu dosyanızda istekleri işleyen ilk adım olarak kullanabilirsiniz:

// Allow from any origin
if(isset($_SERVER["HTTP_ORIGIN"]))
{
    // You can decide if the origin in $_SERVER['HTTP_ORIGIN'] is something you want to allow, or as we do here, just allow all
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
}
else
{
    //No HTTP_ORIGIN set, so we allow any. You can disallow if needed here
    header("Access-Control-Allow-Origin: *");
}

header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 600");    // cache for 10 minutes

if($_SERVER["REQUEST_METHOD"] == "OPTIONS")
{
    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_METHOD"]))
        header("Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT"); //Make sure you remove those you do not want to support

    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"]))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    //Just exit with 200 OK with the above headers for OPTIONS method
    exit(0);
}
//From here, handle the request as it is ok

8

İşleyişini doğru bir şekilde anlamıyorsak, CORS baş ağrısı olabilir. Onları PHP'de kullanıyorum ve sorunsuz çalışıyorlar. buraya referans ver

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 1000");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
header("Access-Control-Allow-Methods: PUT, POST, GET, OPTIONS, DELETE");

7

İstemci tarafı açısal 4 ve sunucu tarafı PHP kullanıldığında bu kod benim için çalışıyor.

header("Access-Control-Allow-Origin: *");

3

bu çalışmalı

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");

0

bu kodu .htaccess'e ekle

app_key, auth_key..etc gibi başlıklara özel kimlik doğrulama anahtarları ekleyin

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Headers: "customKey1,customKey2, headers, Origin, X-Requested-With, Content-Type, Accept, Authorization"

-1

Windows'da, kodu test etmek için bu komutu çalışma penceresine yapıştırın

chrome.exe --user-data-dir = "C: / Chrome geliştirme oturumu" --disable-web-security


Tarayıcınızın web güvenliğini geçici olarak devre dışı bırakmak korkunç bir fikirdir
Machavity
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.