কর্স - একটি 'প্রাকফ্লাইট' কীভাবে একজন httpsquest?


94

আমি ডাব্লুসিএফ পরিষেবাটিতে ক্রস ডোমেন এইচটিটিপি অনুরোধ করার চেষ্টা করছি (যা আমার নিজের)। ক্রস ডোমেন স্ক্রিপ্টিং সীমাবদ্ধতাগুলি নিয়ে কাজ করার জন্য আমি বেশ কয়েকটি কৌশল পড়েছি। কারণ আমার পরিষেবাতে অবশ্যই জিইটি এবং পোষ্ট উভয় অনুরোধের সমন্বয় করতে হবে আমি এমন কিছু গতিশীল স্ক্রিপ্ট ট্যাগ প্রয়োগ করতে পারি না যার জিএসইটির অনুরোধের সিআরসিআলএল ইউআরএল। যেহেতু আমি সার্ভারে পরিবর্তন করতে নির্দ্বিধায় আমি এমন একটি কার্যকর প্রয়োগ বাস্তবায়নের চেষ্টা শুরু করেছি যাতে "অ্যাক্সেস-কন্ট্রোল-অরিজিন-অরিজিন" শিরোনাম এবং ওপশন বিকল্পের অনুরোধের সাথে 'প্রিফলাইট' অনুরোধগুলি অন্তর্ভুক্ত করার জন্য সার্ভারের প্রতিক্রিয়াগুলি কনফিগার করা জড়িত। আমি এই পোস্ট থেকে ধারণা পেয়েছি: CORS কাজ করা

সার্ভারে, আমার ওয়েব পদ্ধতিটি HTTP প্রতিক্রিয়াতে 'অ্যাক্সেস-নিয়ন্ত্রণ-অনুমতি দিন: *' যুক্ত করছে। আমি দেখতে পাচ্ছি যে প্রতিক্রিয়াগুলিতে এখন এই শিরোলেখ অন্তর্ভুক্ত রয়েছে। আমার প্রশ্নটি: আমি কীভাবে একটি অনুরোধ (অপশন) 'প্রিফ্লাইট' করব? আমি জিইটি অনুরোধ করতে jQuery.getJSON ব্যবহার করছি তবে ব্রাউজারটি কুখ্যাতদের সাথে সাথে অনুরোধটি বাতিল করে দেয়:

অরিজিন http: // লোকালহোস্ট অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-উত্স দ্বারা অনুমোদিত নয়

কেউ কি এই সিওআরএস কৌশলটির সাথে পরিচিত? আমার অনুরোধের প্রিফলাইট করতে ক্লায়েন্টে কী পরিবর্তনগুলি করা দরকার?

ধন্যবাদ!

উত্তর:


159

প্রিফলাইট অনুরোধের সময়, আপনাকে নিম্নলিখিত দুটি শিরোনাম দেখতে হবে: অ্যাক্সেস-নিয়ন্ত্রণ-অনুরোধ-পদ্ধতি এবং অ্যাক্সেস-নিয়ন্ত্রণ-অনুরোধ-শিরোনাম। এই অনুরোধ শিরোনামগুলি প্রকৃত অনুরোধটি করার জন্য সার্ভারকে অনুমতি চেয়েছে। আপনার প্রিফলাইট প্রতিক্রিয়াটির কাজ করার আসল অনুরোধের জন্য এই শিরোনামগুলিকে স্বীকৃতি দেওয়া দরকার।

উদাহরণস্বরূপ, ধরুন ব্রাউজারটি নিম্নলিখিত শিরোনামগুলির সাথে একটি অনুরোধ করেছে:

Origin: http://yourdomain.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-Custom-Header

আপনার সার্ভারটি নীচের শিরোনামগুলির সাথে প্রতিক্রিয়া জানাতে হবে:

Access-Control-Allow-Origin: http://yourdomain.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: X-Custom-Header

অ্যাক্সেস-নিয়ন্ত্রণ-মঞ্জুরি-শিরোনাম প্রতিক্রিয়া শিরোনামে বিশেষ মনোযোগ দিন। অ্যাক্সেস-নিয়ন্ত্রণ-অনুরোধ-শিরোনামগুলির অনুরোধ শিরোনামে এই শিরোনামটির মান একই হওয়া উচিত এবং এটি '*' হতে পারে না।

আপনি এই প্রতিক্রিয়াটি প্রিফলাইট অনুরোধটিতে একবার প্রেরণ করলে ব্রাউজারটি আসল অনুরোধ জানাবে। আপনি এখানে সিওআরএস সম্পর্কে আরও শিখতে পারেন: http://www.html5rocks.com/en/tutorials/cors/


আপনি অ্যাক্সেস-কন্ট্রোল-অনুমতি-মুল্যে একাধিক ডোমেন যুক্ত করতে পারেন?
বটবট

@ বটবট আপনি সম্ভবত এখনই এটি কাজ করে ফেলেছেন তবে অন্যরা ভাবতেও পারে এমনটি হতে পারেAccess-Control-Allow-Origin: *
স্টিভ চেম্বারস

4
আমি সম্ভবত কিছু মিস করেছি সুতরাং আমি দুটি এক্সএমএলএইচটিপি অনুরোধ পাঠাতে হবে? প্রিফ্লাইটের জন্য একটি; সাফল্যের প্রতিক্রিয়া পরীক্ষা করুন এবং তারপরে আসল জিজ্ঞাসাটি প্রেরণ করবেন?
কাঙকান

15
কংকান @ প্রিফলাইট অনুরোধটি প্রেরণ সম্পর্কে আপনাকে চিন্তা করার দরকার নেই। যদি অনুরোধটির প্রিফলাইটের প্রয়োজন হয় তবে ব্রাউজারটি এটি আপনার জন্য প্রেরণ করবে।
মনসুর

4
আপনাকে 'বিশেষ মনোযোগ দিন' বিটের জন্য ধন্যবাদ ... যে নোড / এক্সপ্রেস দিয়ে আমার সমস্যাটি সমাধান করেছে আমি এই //cors and preflight filtering app.all('*', function(req, res, next){.. //preflight needs to return exact request-header res.set('Access-Control-Allow-Headers', req.headers['access-control-request-headers']); if ('OPTIONS' == req.method) return res.send(204);next(); });
প্রাকফ্লাইট

0

যদিও এই থ্রেডটি ২০১৪ সালের, তবুও বিষয়টি আমাদের অনেকের কাছে বর্তমান হতে পারে। আমি এখানে jQuery 1.12 / PHP 5.6 প্রসঙ্গে এটির সাথে কীভাবে আচরণ করেছি তা এখানে রয়েছে:

  • jQuery কেবলমাত্র সীমিত হেডার ব্যবহার করে এর এক্সএইচআর অনুরোধ পাঠিয়েছে; কেবল 'অরিজিন' প্রেরণ করা হয়েছিল।
  • কোনও প্রিফলাইট অনুরোধের প্রয়োজন ছিল না।
  • সার্ভারকে কেবল এই জাতীয় অনুরোধ সনাক্ত করতে হয়েছিল এবং "অ্যাক্সেস-কন্ট্রোল-অরিজিন-অরিজিন:" যুক্ত করতে হয়েছিল। This _SERVER ['HTTP_ORIGIN'] শিরোনাম, এটি সনাক্ত করার পরে এটি একটি ক্রস-অরিজিন এক্সএইচআর।

পিএইচপি কোড নমুনা:

if (!empty($_SERVER['HTTP_ORIGIN'])) {
    // Uh oh, this XHR comes from outer space...
    // Use this opportunity to filter out referers that shouldn't be allowed to see this request
    if (!preg_match('@\.partner\.domain\.net$@'))
        die("End of the road if you're not my business partner.");

    // otherwise oblige
    header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);
}
else {
    // local request, no need to send a specific header for CORS
}

বিশেষত exit;কোনও প্রিফলাইটের প্রয়োজন নেই এমনটি যুক্ত করবেন না ।

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