javascript - प्रीफलाइट अनुरोध का जवाब एक्सेस नियंत्रण जांच पास नहीं करता है




ajax http cors http-status-code-405 (13)

मेरा "एपीआई सर्वर" एक PHP अनुप्रयोग है इसलिए इस समस्या को हल करने के लिए मुझे नीचे दिए गए समाधान को हल करने के लिए मिला:

Index.php में लाइनें रखें

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');

मुझे अमेज़ॅन वेब सेवाओं पर एक आरईएसटी एपीआई कॉल करने के लिए ngResource का उपयोग करके यह त्रुटि मिल रही है:

XMLHttpRequest http://server.apiurl.com:8000/s/login?login=facebook लोड नहीं कर सकता है। प्रीफलाइट अनुरोध का जवाब एक्सेस नियंत्रण जांच पास नहीं करता है: अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' शीर्षलेख मौजूद नहीं है। उत्पत्ति ' http: // localhost ' इसलिए पहुंच की अनुमति नहीं है। त्रुटि 405

सर्विस:

socialMarkt.factory('loginService', ['$resource', function($resource){    
    var apiAddress = "http://server.apiurl.com:8000/s/login/";
    return $resource(apiAddress, { login:"facebook", access_token: "@access_token" ,facebook_id: "@facebook_id" }, {
                getUser: {method:'POST'}
            });
}]);

नियंत्रक:

[...]
loginService.getUser(JSON.stringify(fbObj)),
                function(data){
                    console.log(data);
                },
                function(result) {
                    console.error('Error', result.status);
                }
[...]

मैं क्रोम का उपयोग कर रहा हूं, और मुझे नहीं पता कि इस समस्या को ठीक करने के लिए और क्या करना है। मैंने मूल localhost से हेडर स्वीकार करने के लिए सर्वर को भी कॉन्फ़िगर किया है


PHP में आप हेडर जोड़ सकते हैं:

<?php
header ("Access-Control-Allow-Origin: *");
header ("Access-Control-Expose-Headers: Content-Length, X-JSON");
header ("Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS");
header ("Access-Control-Allow-Headers: *");
...

उन लोगों के लिए एपीआई गेटवे के साथ लैम्ब्डा इंटीग्रेटेड प्रॉक्सी का उपयोग कर रहे हैं। आपको अपने लैम्ब्डा फ़ंक्शन को कॉन्फ़िगर करने की आवश्यकता है जैसे कि आप सीधे इसके अनुरोध सबमिट कर रहे हैं, जिसका अर्थ है कि फ़ंक्शन को प्रतिक्रिया शीर्षलेखों को ठीक से सेट करना चाहिए। (यदि आप कस्टम लैम्ब्डा फ़ंक्शंस का उपयोग कर रहे हैं, तो इसे एपीआई गेटवे द्वारा संभाला जाएगा।)

//In your lambda's index.handler():
exports.handler = (event, context, callback) => {
     //on success:
     callback(null, {
           statusCode: 200,
           headers: {
                "Access-Control-Allow-Origin" : "*"
           }
     }
}

आप सीओआरएस मुद्दों में भाग रहे हैं।

इसे ठीक करने के कई तरीके हैं।

  1. सीओआरएस बंद करें। उदाहरण के लिए: क्रोम में कोर को कैसे बंद करें
  2. अपने ब्राउज़र के लिए एक प्लगइन का प्रयोग करें
  3. Nginx जैसे प्रॉक्सी का प्रयोग करें। सेट अप करने का उदाहरण

अधिक verbosely, आप localhost से api.serverurl.com तक पहुंचने का प्रयास कर रहे हैं। यह क्रॉस डोमेन अनुरोध की सटीक परिभाषा है।

अपने काम को पूरा करने के लिए या तो इसे बंद कर दें (ठीक है, अगर आप अन्य साइटों पर जाते हैं और सड़क पर उतर सकते हैं तो आप के लिए खराब सुरक्षा डाल दें) आप प्रॉक्सी का उपयोग कर सकते हैं जो आपके ब्राउज़र को लगता है कि सभी अनुरोध स्थानीय होस्ट से आते हैं वास्तव में आपके पास स्थानीय सर्वर है जो तब दूरस्थ सर्वर को कॉल करता है।

इसलिए api.serverurl.com लोकलहोस्ट बन सकता है: 8000 / एपीआई और आपका स्थानीय nginx या अन्य प्रॉक्सी सही गंतव्य पर भेज देगा।


मुझे लगता है कि क्रोम से सीओआरएस को अक्षम करना अच्छा तरीका नहीं है , क्योंकि यदि आप इसे आयनिक में उपयोग कर रहे हैं, निश्चित रूप से मोबाइल बिल्ड में समस्या फिर से बढ़ेगी।

अपने बैकएंड में ठीक करने के लिए बेहतर है।

सबसे पहले हेडर में, आपको सेट करने की आवश्यकता है-

  • शीर्षलेख ('पहुंच-नियंत्रण-अनुमति-उत्पत्ति: *');
  • हेडर ('हेडर सेट एक्सेस-कंट्रोल-स्वीकृति-हेडर: "उत्पत्ति, एक्स-अनुरोधित-साथ, सामग्री-प्रकार, स्वीकार करें"');

और यदि एपीआई जीईटी और पोस्ट दोनों के रूप में व्यवहार कर रहा है तो अपने हेडर में भी सेट करें-

अगर ($ _SERVER ['REQUEST_METHOD'] == 'विकल्प') {if (isset ($ _ सर्वर ['HTTP_ACCESS_CONTROL_REQUEST_METHOD']) शीर्षलेख ("एक्सेस-कंट्रोल-स्वीकृति-तरीके: प्राप्त करें, पोस्ट करें, विकल्प");
अगर (जारीकर्ता ($ _ सर्वर ['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) शीर्षलेख ("एक्सेस-कंट्रोल-स्वीकृति-हेडर:
{$ _SERVER ['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']} "); बाहर निकलें (0);}


जियोसेवर के स्टैंडअलोन वितरण में जेटी एप्लिकेशन सर्वर शामिल है। क्रॉस-ओरिजिनल रिसोर्स शेयरिंग (सीओआरएस) सक्षम करें ताकि जावास्क्रिप्ट एप्लिकेशन को अपने डोमेन के बाहर जियोसेवर का उपयोग करने की अनुमति मिल सके।

Webapps / geoserver / WEB-INF / web.xml से निम्नलिखित <filter> और <filter-mapping> को अनमोल करें:

<web-app>
  <filter>
      <filter-name>cross-origin</filter-name>
      <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>cross-origin</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

ऐसा कुछ जो याद करना बहुत आसान है ...

समाधान एक्सप्लोरर में, एपीआई-प्रोजेक्ट पर राइट-क्लिक करें। गुण विंडो में सक्षम करने के लिए 'बेनामी प्रमाणीकरण' सेट करें !!!


यदि आप क्रोम-एक्सटेंशन लिख रहे हैं

आपको manifest.json में अपने डोमेन के लिए अनुमतियां जोड़नी manifest.json

"permissions": [
   "http://example.com/*",
   "https://example.com/*"
]

मेरे अपाचे वर्चुअलहोस्ट कॉन्फ़िगरेशन फ़ाइल में, मैंने निम्न पंक्तियां जोड़ दी हैं:

Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Max-Age "1000"
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"

RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

AspNetCore वेब एपीआई में, यह समस्या "Microsoft.AspNetCore.Cors" (ver 1.1.1) जोड़कर और Startup.cs पर नीचे दिए गए परिवर्तन जोड़कर तय की गई है।

public void ConfigureServices(IServiceCollection services)
{ 
    services.AddCors(options =>
    {
          options.AddPolicy("AllowAllHeaders",
                builder =>
            {
                    builder.AllowAnyOrigin()
                           .AllowAnyHeader()
                           .AllowAnyMethod();
                });
    });
    .
    .
    .
}

तथा

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{


    // Shows UseCors with named policy.
    app.UseCors("AllowAllHeaders");
    .
    .
    .
}

और नियंत्रक पर [EnableCors("AllowAllHeaders")]


यदि आप मौका से आईआईएस सर्वर का उपयोग कर रहे हैं। आप HTTP अनुरोध शीर्षलेख विकल्प में शीर्षलेख नीचे सेट कर सकते हैं।

Access-Control-Allow-Origin:*
Access-Control-Allow-Methods: 'HEAD, GET, POST, PUT, PATCH, DELETE'
Access-Control-Allow-Headers: 'Origin, Content-Type, X-Auth-Token';

इस पोस्ट के साथ, आदि प्राप्त करें, ठीक काम करेगा।


पाइथन फ्लास्क सर्वर के लिए, आप क्रॉस डोमेन अनुरोधों को सक्षम करने के लिए फ्लास्क-कॉर्स प्लगइन का उपयोग कर सकते हैं।

देखें: https://flask-cors.readthedocs.io/en/latest/


मैं इस समस्या को पूरा करता हूं, जब मैं Django REST बैकएंड को रिकॉर्ड पोस्ट करने के लिए Angular का उपयोग करता हूं। कभी-कभी, इस समस्या के लिए कोई विशेष कारण नहीं है। अपने Django के त्रुटि संदेश को ध्यान से देखें, आपको एक समाधान मिलेगा।





javascript ajax http cors http-status-code-405