অনুরোধ শিরোনাম ক্ষেত্র অ্যাক্সেস-নিয়ন্ত্রণ-অনুমতি-শিরোনাম অ্যাক্সেস-নিয়ন্ত্রণ-অনুমতি-শিরোনাম দ্বারা অনুমোদিত নয়


224

আমি একটি পোস্ট অনুরোধের সাথে আমার সার্ভারে ফাইলগুলি প্রেরণের চেষ্টা করছি, কিন্তু এটি যখন এটি প্রেরণ করে তখন ত্রুটির কারণ হয়:

অনুরোধ শিরোনাম ক্ষেত্রের সামগ্রী-প্রকার অ্যাক্সেস-নিয়ন্ত্রণ-মঞ্জুরি-শিরোনাম দ্বারা অনুমোদিত নয়।

তাই আমি ত্রুটিটি গুগল করে শিরোনামগুলি যুক্ত করেছি:

$http.post($rootScope.URL, {params: arguments}, {headers: {
    "Access-Control-Allow-Origin" : "*",
    "Access-Control-Allow-Methods" : "GET,POST,PUT,DELETE,OPTIONS",
    "Access-Control-Allow-Headers": "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
}

তারপরে আমি ত্রুটিটি পেয়েছি:

অনুরোধ শিরোনামের ক্ষেত্র অ্যাক্সেস-নিয়ন্ত্রণ-মঞ্জুরি-শিরোনাম দ্বারা অ্যাক্সেস-নিয়ন্ত্রণ-মঞ্জুরি-উত্স অনুমোদিত নয়

সুতরাং আমি এটি গুগল করেছিলাম এবং কেবল একই অনুরূপ প্রশ্নটি আমি খুঁজে পেলাম একটি অর্ধ উত্তর দেওয়া হয়েছিল তবে বন্ধ হয়ে গেছে বিষয় হিসাবে। আমার কোন শিরোনাম যুক্ত / সরানোর কথা রয়েছে?


এই শিরোনামগুলি সার্ভার থেকে ব্রাউজারে প্রেরণ করা হয়েছে যাতে ব্রাউজারটি ঠিক করতে পারে যে জেএস প্রতিক্রিয়াটি পার্স করার অনুমতি দেয় কিনা। তাদের অনুরোধে যুক্ত করার কোনও মূল্য নেই।
পেলিয়াডল্ফো

উত্তর:


189

সার্ভার (যে POST রিকোয়েস্ট পাঠানো হয়) অন্তর্ভুক্ত করতে হবে Access-Control-Allow-Headersহেডার (ইত্যাদি) তার প্রতিক্রিয়ায় । তাদের ক্লায়েন্টের কাছ থেকে আপনার অনুরোধে রাখার কোনও প্রভাব নেই।

এটি কারণ ক্রস-অরিজিন অনুরোধগুলি গ্রহণ করে (এবং এটি Content-Typeঅনুরোধ শিরোনামকে অনুমতি দেয় এবং তাই) এটি সার্ভারের উপর নির্ভর করে - ক্লায়েন্ট নিজে সিদ্ধান্ত নিতে পারে না যে প্রদত্ত সার্ভারটি সিওআরএসকে অনুমতি দেবে।


5
আমি কীভাবে শিরোনামগুলিকে ব্যাকএন্ডে সেট করব?
ব্যবহারকারী3194367

11
@ ব্যবহারকারী3194367: আপনার ব্যাকএন্ডে নির্ভর করে।
ফেলিক্স ক্লিং

14
আমার ধারণা আমার সার্ভার লোকের সাথে কথা বলতে হবে।
ব্যবহারকারী3194367

2
প্রতিক্রিয়া.এডিএইচইডার ("অ্যাক্সেস-কন্ট্রোল-হেডারের মঞ্জুরি দিন", "আপনার কী");
ময়ূরেশ

2
@ ময়ূরেশ তোমার কে কী? Content-Type?
zhuguowei

240

আমারও একই সমস্যা ছিল। JQuery ডকুমেন্টেশনে আমি পেয়েছি:

ক্রস ডোমেইন অনুরোধ, ব্যতীত অন্য কিছু বিষয়বস্তুর প্রকার সেটিং এর জন্য application/x-www-form-urlencoded, multipart/form-dataঅথবা text/plainএকটি preflight বিকল্প সার্ভারের সাথে অনুরোধ পাঠাতে ব্রাউজার আরম্ভ হবে।

সুতরাং যদিও সার্ভার ক্রস অরিজিন অনুরোধের অনুমতি দেয় তবে অনুমতি দেয় না তবে Access-Control-Allow-Headersএটি ত্রুটি ছুঁড়ে দেবে । ডিফল্টরূপে কৌণিক বিষয়বস্তুর প্রকারটি application/json, যা একটি অপশন অনুরোধ প্রেরণের চেষ্টা করছে। কৌনিক ডিফল্ট শিরোনামটি ওভাররাইট করার চেষ্টা করুন বা Access-Control-Allow-Headersসার্ভারের শেষের দিকে অনুমতি দিন । এখানে একটি কৌণিক নমুনা:

$http.post(url, data, {
    headers : {
        'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
    }
});

28
এটি একটি গ্রহণযোগ্য উত্তর হওয়া উচিত, অন্যটির চেয়ে অনেক বেশি তথ্যপূর্ণ!
মাইক সিজেন্ডেল

1
আমি মাল্টিপার্ট / ফর্ম-ডেটা চাই কারণ আমি কিছু উপস্থাপন করতে চাই
ভ্লাদো

3
or allow Access-Control-Allow-Headers in server endকীভাবে?
ওমর

1
@ ওমার এটি নির্ভর করে আপনি কোন সার্ভার প্ল্যাটফর্মটি ব্যবহার করছেন। যদি জাভা অন্যান্য উত্তরগুলির উদাহরণে পিএইচপি থাকে তবে headerপ্রতিক্রিয়াটির শিরোনাম নির্ধারণের জন্য একটি কার্যকারিতা রয়েছে
ফিশারম্যান

1
অবশেষে, দুই দিন গবেষণা পরে। আপনাকে ধন্যবাদ দেওয়ার মতো কোনও শব্দ আমার কাছে নেই!
মিকি সালারিয়া

51

যদি এটি কাউকে সহায়তা করে, (যদিও এটি দরিদ্রের মতো হলেও এটি কেবলমাত্র আমাদের উদ্দেশ্য হিসাবে এটির অনুমতি দেওয়া উচিত) এখানে জাভা সমাধান হিসাবে আমি একই সমস্যার মুখোমুখি হয়েছি। [সম্পাদনা] ওয়াইল্ড কার্ড * ব্যবহার করবেন না কারণ এটি একটি খারাপ সমাধান, localhostআপনার যদি স্থানীয়ভাবে কিছু কাজ করার প্রয়োজন হয় তবে ব্যবহার করুন ।

public class SimpleCORSFilter implements Filter {

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "my-authorized-proxy-or-domain");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
    chain.doFilter(req, res);
}

public void init(FilterConfig filterConfig) {}

public void destroy() {}

}

অ্যাক্সেস-নিয়ন্ত্রণ-অনুরোধ-শিরোনামের একাধিক উত্তরের সাক্ষ্য হিসাবে, বিভিন্ন পরিবেশের কারণে স্পষ্টত পার্থক্য রয়েছে। আমার জন্য যা কাজ করেছিল তা হ'ল অনুরোধের অবজেক্টে অ্যাক্সেস পাওয়া এবং শিরোনামগুলির মানগুলি ডাম্প করা, তবে বিশেষত "অ্যাক্সেস-কন্ট্রোল-রিকোয়েস্ট-শিরোনাম" এর শিরোনামের মান। তারপরে, আপনার প্রতিক্রিয়াতে এটি অনুলিপি করুন / আটকে দিন set সেটহেইডার ("অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-শিরোনামগুলি", "{এখানে পেস্ট করুন}"); আমি জাভাও ব্যবহার করছি, তবে আমার অতিরিক্ত মান প্রয়োজন এবং এই উত্তরটিতে আমার কিছু প্রয়োজন নেই বলে উল্লেখ করেছেন।
সফটওয়্যার

এটি একটি আংশিক (এবং যেমন বলা হয়েছে, দরিদ্র) সমাধান ছিল এক বছর আগে লোককে সহায়তা এবং ক্লুগুলি ভাগ করার জন্য। আমি নীচে ভোট দেওয়ার বিষয়টি দেখতে পাচ্ছি না তবে ভাল এটি আপনার স্বাধীনতা। সার্ভারের পাশের শিরোনামগুলিকে মঞ্জুরি দেওয়ার ধারণাটি হ'ল একটি বিকল্প অনুরোধ পোস্ট করার পরে ক্লায়েন্ট / ব্রাউজারটি জানে যে কোন শিরোনাম অনুমোদিত। আমি স্বীকার করি কিছুটা বিভ্রান্তি আছে, তখন থেকে আমার সিওআরএস ফিল্টারটি অনেকটাই পরিবর্তিত হয়েছে। আরও ভাল অনুশীলন হিসাবে, অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-উত্স কখনই * হওয়া উচিত নয়; আমার বাস্তবায়নে এটি একটি সম্পত্তি দ্বারা সেট করা হয়।
lekant

সমাধান সর্বোত্তম কার্যাভ্যাস অন্তর্ভুক্ত করা সম্পাদনা করা হয়েছে
lekant

16

সার্ভারের (যে পোস্টের অনুরোধটি প্রেরণ করা হয়েছে) এর প্রতিক্রিয়ায় সামগ্রী-প্রকারের শিরোনাম অন্তর্ভুক্ত করা দরকার ।

একটি কাস্টম "X_ACCESS_TOKEN" শিরোনাম সহ অন্তর্ভুক্ত করার জন্য এখানে আদর্শ শিরোনামগুলির একটি তালিকা রয়েছে:

"X-ACCESS_TOKEN", "Access-Control-Allow-Origin", "Authorization", "Origin", "x-requested-with", "Content-Type", "Content-Range", "Content-Disposition", "Content-Description"

আপনার HTTP সার্ভার লোককে সেই ওয়েব সার্ভারের জন্য কনফিগার করতে হবে যা আপনি আপনার অনুরোধগুলি পাঠাচ্ছেন।

আপনি আপনার সার্ভার লোকটিকে "সামগ্রী-দৈর্ঘ্য" শিরোনামটি প্রকাশ করতে বলতে চাইতে পারেন।

তিনি এটিকে ক্রস-অরিজিন রিসোর্স শেয়ারিং (সিওআরএস) অনুরোধ হিসাবে স্বীকৃতি দেবেন এবং সেগুলি সার্ভারের কনফিগারেশনগুলি তৈরি করার অর্থ বোঝা উচিত।

বিস্তারিত জানার জন্য দেখুন:


13

আপনি এটি দিয়ে পিএইচপি-তে যথাযথ শিরোনাম সক্রিয় করতে পারেন:

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, X-Requested-With");

4
আপনার উত্তরটি অন্য উত্তরের চেয়ে আলাদা কীভাবে দয়া করে তা বর্ণনা করুন। কিছু কোড পোস্ট করা খুব সহায়ক নয়।
oscfri

1
আপনি একজন রক-স্টার, বাকী উত্তরগুলি প্রযুক্তিগত দিক দিয়ে। আপনার পদ্ধতিগুলি যেভাবে অনুমতি দেওয়া উচিত তা নির্দিষ্ট করে আপনার সমস্যাগুলি সমাধান করে!
ড্যানিয়েল জেডএ

1
@ ড্যানিয়েলজাহ যদিও আপনি বুঝতে পেরেছেন যে আপনি "অন্যান্য উত্তরগুলি প্রযুক্তিগত দিক দিয়ে বোঝাচ্ছেন" আপনি কী বোঝাতে চেয়েছেন তাই আপনি কীভাবে আপনার কোড চালাতে চাইছেন তাই এসও বোঝানো হয়েছে কারণ জিনিসগুলি কেবলমাত্র কেন কাজ করছে না তা আপনার প্রযুক্তিগত দিক সম্পর্কে সন্ধান করা উচিত you কিভাবে কাজ করতে হয়। সমাধানগুলিতে মন্তব্য করার সময় এই আচরণটি ঘেরাও করবেন না ...
নিকোলাসাসি

8

নিম্নলিখিতটি নোডেজ সহ আমার জন্য কাজ করে:

xServer.use(function(req, res, next) {
  res.setHeader("Access-Control-Allow-Origin", 'http://localhost:8080');
  res.setHeader('Access-Control-Allow-Methods', 'POST,GET,OPTIONS,PUT,DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Accept');

  next();
});

অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-পদ্ধতিগুলির ক্রমটি কী বিবেচনা করে?
ভিনি

@ ভিনি, আমার মনে হয় এতে কিছু যায় আসে না।
নিনজা কোডিং

4

আপনি যে শিরোনামগুলি সেট করার চেষ্টা করছেন তা হ'ল প্রতিক্রিয়া শিরোনাম। আপনি যে অনুরোধটি তৈরি করছেন সেই সার্ভারের মাধ্যমে, প্রতিক্রিয়া হিসাবে সেগুলি সরবরাহ করতে হবে।

তাদের ক্লায়েন্টে সেট করা হচ্ছে না। অনুমতি অনুমোদনের কোনও উপায় থাকা অর্থহীন হবে যদি তারা ডেটা মালিকানাধীন সাইটের পরিবর্তে অনুমতি চাইলে এমন সাইট দ্বারা অনুমতি দেওয়া যেতে পারে ।


আমি কীভাবে শিরোনামগুলিকে ব্যাকএন্ডে সেট করব?
ব্যবহারকারী3194367

@ ব্যবহারকারী3194367 - এটি আপনার ব্যাকএন্ডের উপর নির্ভর করে। আপনি কী HTTP সার্ভার বা প্রোগ্রামিং ভাষাটি অনুরোধ করছেন তা আমি জানি না।
কুইন্টিন

আমার ধারণা আমার সার্ভার লোকের সাথে কথা বলতে হবে।
ব্যবহারকারী3194367

3

এক্সপ্রেস সার্ভারের সাথে যদি কেউ এই সমস্যাটি অনুভব করে তবে নিম্নলিখিত মিডওয়্যারটি যুক্ত করুন

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

3

আপনি যদি পিসি বা ম্যাকের ক্রোমে আয়নিক 2 বা অ্যাঙ্গুলারজ 2 এর জন্য কিছু জাভাস্ক্রিপ্ট অনুরোধগুলি পরীক্ষা করে থাকেন তবে ক্রস উত্সের অনুমতি দেওয়ার জন্য আপনি ক্রোম ব্রাউজারের জন্য সিওআরএস প্লাগইন ইনস্টল করেছেন তা নিশ্চিত হন।

mayba পেতে অনুরোধগুলি প্রয়োজন ছাড়াই কাজ করবে, তবে পোস্ট করুন এবং মুছে ফেলুন এবং সমস্যা ছাড়াই পরীক্ষার জন্য কর্স প্লাগইন ইনস্টল করতে হবে, এই নির্দিষ্টকরণটি শীতল নয়, তবে আমি জানি না যে CORS প্লাগইন ছাড়া লোকেরা কীভাবে এটি করে।

এবং এও নিশ্চিত হন যে কিছু কিছু জসন স্ট্যাটাস দিয়ে জসন প্রতিক্রিয়া 400 এনেছে না


3

এটি ব্যাকএন্ড সমস্যা। যদি ব্যাকএন্ড পরিবর্তন cors.js এ পাল এপি ব্যবহার করেন এবং আপনার ফাইলটি এখানে যুক্ত করুন

module.exports.cors = {
  allRoutes: true,
  origin: '*',
  credentials: true,
  methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD',
  headers: 'Origin, X-Requested-With, Content-Type, Accept, Engaged-Auth-Token'
};

3

ইন Asp নেট কোর , দ্রুত এটি উন্নয়নের জন্য কাজ করা; ইন Startup.cs, Configure methodযোগ করুন

app.UseCors(options => options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());

2

আমার ক্ষেত্রে, আমি একটি ওয়েব পরিষেবা পদ্ধতিতে @ হাইডারপ্যারাম হিসাবে বেশ কয়েকটি পরামিতি গ্রহণ করছি।

এই প্যারামিটারগুলি আপনার সিওআর ফিল্টারে সেইভাবে ঘোষণা করা উচিত:

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {

        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");
        ...
        headers.add("Access-Control-Allow-Headers", 
        /*
         * name of the @HeaderParam("name") must be declared here (raw String):
         */
        "name", ...);
        headers.add("Access-Control-Allow-Credentials", "true");
        headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");   
    }
}

2

Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-Headersত্রুটির অর্থ Access-Control-Allow-Originএইচটিটিপি শিরোনামের ক্ষেত্রটি প্রতিক্রিয়া দ্বারা পরিচালিত বা অনুমোদিত নয়। Access-Control-Allow-Originঅনুরোধ শিরোনাম থেকে ক্ষেত্রটি সরান ।


2

আপনি যদি localhostসমস্যাটি সমাধানের জন্য ব্যবহার করে থাকেন এবং পিএইচপি সেট করে রাখেন:

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

আপনার ফ্রন্ট-এন্ড ব্যবহার থেকে:

{headers: {"Content-Type": "application/json"}}

এবং কোন সমস্যা থেকে বুম localhost!

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