পিএইচপি শিরোনাম সহ ক্রস-অরিজিন অনুরোধ শিরোনাম (সিওআরএস)


146

আমার একটি সাধারণ পিএইচপি স্ক্রিপ্ট রয়েছে যা আমি ক্রস-ডোমেন 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

CORS অনুরোধগুলি সঠিকভাবে পরিচালনা করা একটি বাচ্চা আরও জড়িত। এখানে একটি ফাংশন যা আরও সম্পূর্ণরূপে (এবং সঠিকভাবে) প্রতিক্রিয়া জানাবে।

/**
 *  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 পরিষেবা ব্যবহারের অনুমতি দেবেন না, আপনি এটি নির্ভর করে এমন কিছু সেটকে সীমাবদ্ধ রাখবেন যেটি আপনি বিশ্বাস করার সিদ্ধান্ত নিয়েছিলেন।
স্ল্যাশিংওয়েপন

অবগতির জন্য, এই সমাধান শুধুমাত্র আমার জন্য একটি কাজ Linux server, এ IISকোনো কারণে শুধু কাজ করে নি, আমি যদি তার আমার হোস্টিং জবাব দিই বা শুধু তাই নয় উপযুক্ত জন্যIIS
ncubica

1
ধন্যবাদ! এই উত্তরটি বুকমার্ক করতে হবে। খুব খারাপ আমরা এটিকে একটি নতুন উত্তর হিসাবে চিহ্নিত করতে পারি না
Ascherer

1
কেবলমাত্র এটিই সত্যিকারের কাজ! .. কেবল অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-উত্স পরিবর্তন করুন: * অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-উত্স: TO _S _SERVER ['HTTP_ORIGIN']}
রেনান ফ্রাঙ্কা

60

আমি একই ত্রুটি পেয়েছি, এবং আমার ব্যাক-এন্ড স্ক্রিপ্টে নিম্নলিখিত পিএইচপি দিয়ে এটি ঠিক করেছি:

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
দয়া করে ব্যাখ্যা করুন কেন এটা যথেষ্ট নয় এবং যা ন্যূনতম উদাহরণ হল যথেষ্ট।
হাফপাস্টফোর.কম

দুর্ভাগ্যক্রমে, আমি ঠিক মনে করি না এবং আমার এটি পুনরায় তদন্ত করার এখনই সময় নেই তবে যতটা আমি মনে করি, ওয়েবসভার / ব্রাউজারের পক্ষ থেকে কিছু প্রাথমিক অনুমান ছিল যা এটি কাজ করে না। এটি আমার পক্ষে কাজ করা সর্বনিম্ন কোড ছিল।
সিংসগর হালমাই

24

এই ফিক্সটি নিয়ে কাজ করার জন্য আমি কেবল ড্রপজোন এবং অন্যান্য প্লাগইন পেতে সক্ষম হয়েছি (অ্যাঙ্গুলারজ + পিএইচপি ব্যাকএন্ড)

 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');

এটি আপনার আপলোড.এফপি বা যেখানে আপনি আপনার অনুরোধটি প্রেরণ করবেন তা যুক্ত করুন (উদাহরণস্বরূপ যদি আপনার আপলোড.এইচটিএমএল থাকে এবং আপনার আপলোড.পিএফপি ফাইলগুলি সংযুক্ত করতে হবে, তবে এই 4 টি লাইন অনুলিপি করুন এবং পেস্ট করুন)। এছাড়াও আপনি যদি ক্রোম / মজিলায় সিওআরএস প্লাগইন / অ্যাডোন ব্যবহার করছেন তবে সিওআরএস সক্ষম করার জন্য একাধিকবার এগুলি টগল করতে ভুলবেন না


15

আপনি যদি পিএইচপি থেকে কোনও কর্নার পরিষেবা তৈরি করতে চান তবে আপনি এই কোডটি আপনার ফাইলের প্রথম পদক্ষেপ হিসাবে ব্যবহার করতে পারেন যা অনুরোধগুলি পরিচালনা করে:

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

CORS মাথাব্যথায় পরিণত হতে পারে, যদি আমরা সঠিকভাবে এর কাজটি বুঝতে না পারি। আমি তাদের পিএইচপি ব্যবহার করি এবং তারা সমস্যা ছাড়াই কাজ করে। এখানে রেফারেন্স

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

ক্লায়েন্ট সাইড হিসাবে কৌণিক 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 এ যুক্ত করুন

app_key, auth_key..etc এর মতো শিরোনামে কাস্টম প্রমাণীকরণ কী যুক্ত করুন

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 = "সি: / ক্রোম ডে সেশন" - অক্ষম-ওয়েব-সুরক্ষা


অস্থায়ীভাবে এমনকি আপনার ব্রাউজারের ওয়েব সুরক্ষা অক্ষম করা একটি ভয়ানক ধারণা
মাচাভিটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.