PHP हेडर के साथ क्रॉस-ऑरिजिन रिक्वेस्ट हेडर्स (कॉर्स)


146

मेरे पास एक सरल PHP स्क्रिप्ट है जिसे मैं क्रॉस-डोमेन CORS अनुरोध का प्रयास कर रहा हूं:

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

फिर भी मुझे अभी भी त्रुटि मिलती है:

हेडर फ़ील्ड X-Requested-Withद्वारा अनुरोध की अनुमति नहीं हैAccess-Control-Allow-Headers

मुझे कुछ भी याद आ रहा है?

जवाबों:


59

Access-Control-Allow-Headers*स्वीकृत मूल्य के रूप में अनुमति नहीं देता है , यहां मोज़िला प्रलेखन देखें ।

तारांकन के बजाय, आपको स्वीकृत हेडर भेजना चाहिए (पहले X-Requested-Withत्रुटि के अनुसार)।


289

कॉर्स अनुरोधों को ठीक से निपटाना एक अधिक शामिल है। यहां एक फ़ंक्शन है जो अधिक पूर्ण (और ठीक से) प्रतिक्रिया देगा।

/**
 *  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 ओरिजिनल वैल्यू को वापस भेजने की अनुमति मूल रूप से है, कोई भी आपको कुकीज़ के साथ अनुरोध भेजने की अनुमति देगा, इस प्रकार संभवतः एक उपयोगकर्ता से एक सत्र चुरा रहा है जो आपकी साइट में लॉग इन किया था, फिर हमलावर का पेज देखा। आप या तो '*' भेजना चाहते हैं (जो कुकीज़ को रोक देगा और सत्र चोरी को रोक देगा) या विशिष्ट डोमेन जिसके लिए आप काम करना चाहते हैं।
जूल्स

1
माना। व्यवहार में आप शायद किसी भी पुराने डोमेन को अपनी CORS सेवा का उपयोग करने की अनुमति नहीं देंगे, आप इसे कुछ ऐसे सेटों तक सीमित कर देंगे, जिन पर आपने भरोसा करने का फैसला किया है।
slashingweapon

FYI करें, इस समाधान ने केवल मेरे लिए काम किया Linux server, IISकिसी कारण से बस काम नहीं किया, मुझे नहीं पता कि इसकी मेजबानी या सिर्फ इसके लिए उपयुक्त नहीं हैIIS
ncubica

1
धन्यवाद! इस उत्तर को बुकमार्क करना होगा। बहुत बुरा हम इसे एक नए जवाब के रूप में चिह्नित नहीं कर सकते हैं
Ascherer

1
केवल यह है कि के सही मायने में काम .. बस परिवर्तन पहुंच-नियंत्रण-अनुमति दें-मूल: * के लिए उपयोग-नियंत्रण-अनुमति दें-उत्पत्ति: {$ _SERVER '[' HTTP_ORIGIN ']}
Renan Franca

60

मुझे वही त्रुटि मिली, और इसे मेरी बैक-एंड स्क्रिप्ट में निम्न PHP के साथ तय किया:

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

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

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

35

कई विवरण इंटरनेट-वाइड का उल्लेख नहीं है कि निर्दिष्ट Access-Control-Allow-Originकरना पर्याप्त नहीं है। यहाँ एक पूर्ण उदाहरण है जो मेरे लिए काम करता है:

<?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
कृपया बताएं कि यह पर्याप्त नहीं है और क्या कम से कम उदाहरण है पर्याप्त।
19

दुर्भाग्य से, मुझे ठीक से याद नहीं है और मेरे पास अब दोबारा इसकी जांच करने का समय नहीं है, लेकिन जितना मुझे याद है, वेबसर्वर / ब्राउज़र की तरफ से कुछ बुनियादी धारणाएँ थीं, जिन्होंने इसे काम नहीं किया। यह न्यूनतम कोड था जो मेरे लिए काम करता था।
Csongor Halmai

24

मैं बस इस सुधार (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');

इसे अपने upload.php में जोड़ें या जहाँ आप अपना अनुरोध भेजेंगे (उदाहरण के लिए यदि आपके पास upload.html है और आपको files को upload.php में संलग्न करना है, तो इन 4 पंक्तियों को कॉपी और पेस्ट करें)। इसके अलावा अगर आप क्रोम / मोजिला में कॉर्स प्लगइन्स / एडऑन का उपयोग कर रहे हैं, तो सुनिश्चित करें कि कॉर्स सक्षम होने के लिए उन्हें एक से अधिक बार टॉगल करें।


15

यदि आप PHP से एक CORS सेवा बनाना चाहते हैं, तो आप इस कोड को अपनी फ़ाइल के पहले चरण के रूप में उपयोग कर सकते हैं जो अनुरोधों को संभालता है:

// 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

कॉर्स सिरदर्द बन सकता है, अगर हम इसकी कार्यप्रणाली को सही तरह से नहीं समझते हैं। मैं उन्हें PHP में उपयोग करता हूं और वे समस्याओं के बिना काम करते हैं। यहाँ संदर्भ

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

क्लाइंट पक्ष और PHP के रूप में सर्वर पक्ष के रूप में कोणीय 4 का उपयोग करते समय यह बहुत कोड मेरे लिए काम करता है।

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

3

यह काम करना चाहिए

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

0

इस कोड को .htaccess में जोड़ें

हेडर, कस्टम_की..टीक जैसे हेडर में कस्टम प्रमाणीकरण कुंजी जोड़ें

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

-1

विंडोज में, कोड का परीक्षण करने के लिए इस कमांड को केवल रन विंडो में पेस्ट करें

chrome.exe --user-data-dir = "C: / Chrome dev session" --disable-web-security


अपने ब्राउज़र की वेब सुरक्षा को अक्षम करने, यहां तक कि अस्थायी रूप से, एक भयानक विचार है
Machavity
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.