내 JavaScript 코드는 요청 된 리소스 "오류"오류에 "NO '액세스 제어 - 허용 원점'헤더가"오류가 있지 않습니까? "
질문
MOD 참고 사항 :이 질문은 XMLHTTPRequest / fetch / etc에 대한 정보입니다.브라우저에서 우편 배달부가 아닌 동안 동일한 액세스 정책 제한 (오류를 언급하는 오류가 발생합니다).이 질문은 "NO '액세스 제어 허용 기원'..."을 수정하는 방법에 관한 것이 아닙니다.그들이 일어난 이유에 관한 것입니다.
게시를 중지하십시오 : 태양 아래의 모든 언어 / 프레임 워크에 대한 Cors 구성.대신 귀하의 관련 언어 / 프레임 워크의 질문을 찾으십시오. 코르를 우회 할 수있는 제 3 자 서비스 다양한 브라우저에 대해 COR을 끄기위한 명령 줄 옵션
RESTful API 내장 플라스크에 연결하여 JavaScript를 사용하여 승인을 수행하려고합니다.그러나 요청을 할 때 다음 오류가 발생합니다.
xmlhttprequest http : // myApiURL / 로그인을로드 할 수 없습니다.요청 된 자원에 '액세스 제어 허용 기원'헤더가 없습니다.따라서 'null'원본은 허용되지 않습니다.
API 또는 원격 리소스가 헤더를 설정해야한다는 것을 알고 있지만 Chrome Extension Postman을 통해 요청을 수행했을 때 왜 작동 했습니까?
이것은 요청 코드입니다.
$.ajax({
type: 'POST',
dataType: 'text',
url: api,
username: 'user',
password: 'pass',
crossDomain: true,
xhrFields: {
withCredentials: true,
},
})
.done(function (data) {
console.log('done');
})
.fail(function (xhr, textStatus, errorThrown) {
alert(xhr.responseText);
alert(textStatus);
});
답변
내가 그것을 이해하면 페이지가 켜져있는 것보다 다른 도메인에 XMLHttpRequest를 수행 중입니다.따라서 브라우저가 보안 이유로 동일한 원점에서 요청을 허용하므로 브라우저가 차단됩니다.도메인 간 요청을 원할 때 다른 것을해야합니다.이를 달성하는 방법에 대한 자습서에 대한 튜토리얼.
포스트맨을 사용하는 경우이 정책에 의해 제한되지 않습니다.교차 원점에서 인용 된 xmlhttpRequest :
일반 웹 페이지는 XMLHTTPRequest 객체를 사용하여 원격 서버에서 데이터를 보내고받을 수 있지만 동일한 원본 정책으로 제한됩니다.확장은 그렇게 제한되지 않습니다.먼저 원본이 아닌 원격 사용 권한을 요청하는 한 Origin 외부의 원격 서버와의 확장자가 원격 서버와 대화 할 수 있습니다.
답변
경고 : 액세스 제어 - 허용 기원을 사용하는 것은 * API / 웹 사이트를 교차 사이트 요청 위조 (CSRF) 공격에 취약하게 할 수 있습니다.이 코드를 사용하기 전에 위험을 이해하는 것을 확실하게하십시오.
PHP를 사용하는 경우 해결하기가 매우 간단합니다.요청을 처리하는 PHP 페이지의 시작 부분에 다음 스크립트를 추가하십시오.
<?php header('Access-Control-Allow-Origin: *'); ?>
노드 레드를 사용하는 경우 다음 줄을 주석 처리하여 노드 - 빨간색 / Settings.js 파일의 Cors를 허용해야합니다.
// The following property can be used to configure cross-origin resource sharing
// in the HTTP nodes.
// See https://github.com/troygoode/node-cors#configuration-options for
// details on its contents. The following is a basic permissive set of options:
httpNodeCors: {
origin: "*",
methods: "GET,PUT,POST,DELETE"
},
질문과 동일한 플라스크를 사용하는 경우;Flask-Cors를 먼저 설치해야합니다
$ pip install -U flask-cors
그런 다음 응용 프로그램의 플라스크 코르를 포함하십시오.
from flask_cors import CORS
간단한 응용 프로그램은 다음과 같습니다.
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
@app.route("/")
def helloWorld():
return "Hello, cross-origin-world!"
자세한 내용은 플라스크 문서를 확인할 수 있습니다.
답변
때문에 $ .ajax ({type : "post"- 호출 옵션 $ .post (- 포스트를 호출합니다
둘 다 다르다.우편 맨은 "포스트"를 제대로 호출하지만, 전화 할 때 "옵션"이됩니다.
C # 웹 서비스 - Web API.
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
Ajax 전화에서 실수하지 않은지 확인하십시오.
jquery.
$.ajax({
url: 'http://mysite.microsoft.sample.xyz.com/api/mycall',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
type: "POST", /* or type:"GET" or type:"PUT" */
dataType: "json",
data: {
},
success: function (result) {
console.log(result);
},
error: function () {
console.log("error");
}
});
참고 : 타사 웹 사이트에서 콘텐츠를 다운로드하는 경우이 문제는 도움이되지 않습니다.다음 코드를 시도 할 수 있지만 JavaScript는 아닙니다.
System.Net.WebClient wc = new System.Net.WebClient();
string str = wc.DownloadString("http://mysite.microsoft.sample.xyz.com/api/mycall");
답변
깊은
아래의 조사에서 API로서 http://example.com 대신 http://example.com을 사용합니다.귀하의 페이지가 http : //my-site.local : 8088에 있다고 가정합니다.
참고 : API와 페이지에는 다른 도메인이 있습니다!
다른 결과를 보는 이유는 우체원입니다.
header host = example.com (API) 헤더 원본을 설정하지 않습니다 우체부는 실제로 모든 웹 사이트 URL을 사용하지 않습니다 (당신은 당신의 API 주소 만 포스트맨에만 입력하십시오) - API에 대한 요청 만 보내므로 웹 사이트가 API와 동일한 주소가 동일하다고 가정합니다 (브라우저는이를 가정하지 않습니다)
이것은 사이트 및 API가 동일한 도메인을 갖는 경우 요청을 보내는 브라우저와 유사합니다 (브라우저는 헤더 항목 참조 = http : //my-site.local : 8088을 설정하지만 Postman에서는 참조하지 않습니다)....에원점 헤더가 설정되지 않은 경우 일반적으로 서버는 기본적으로 이러한 요청을 허용합니다.

이것은 포스트 맨이 요청을 보내는 표준 방법입니다.그러나 사이트와 API가 다른 도메인을 가지고있을 때 브라우저가 요청을 전송 한 다음 코르가 자동으로 자동으로 표시됩니다.
header host = example.com (API로)을 설정합니다. 헤더 Origin = http : //my-site.local : 8088 (사이트)
머리글 참조자는 원점과 동일한 값 을가집니다).그리고 이제 Chrome의 콘솔 및 네트워크 탭에서 다음을 볼 수 있습니다.


호스트가 있으면! = 원본이 CORS는 CORS이며 서버가 이러한 요청을 감지하면 일반적으로 기본적으로이를 차단합니다.
Origin = NULL은 로컬 디렉토리에서 HTML 컨텐츠를 열면 요청을 보냅니다.아래의 스 니펫 (그러나 여기에서는 호스트 헤더가 전혀 설정되지 않음)을
fetch ( 'http://example.com/api', {method : 'post'}); Chrome-Console> 네트워크 탭을보십시오
간단한 CORS 요청을 사용하지 않으면 일반적으로 브라우저는 주 요청을 보내기 전에 옵션 요청을 자동으로 보냅니다. 자세한 정보는 여기에 있습니다.아래의 스 니펫은 다음과 같습니다.
fetch ( 'http://example.com/api', { 방법 : '포스트', 헤더 : { 'content-type': '응용 프로그램 / json'} }); Chrome-Console -> Network Tab에서 'API'요청을보십시오. 이것은 옵션 요청입니다 (서버가 게시물 요청을 보낼 수 없음)
CORS 요청을 허용하도록 서버 구성을 변경할 수 있습니다.
nginx (nginx.conf 파일)에서 Cors를 켜는 구성 예입니다. 아파치에 대해 항상 / "$ http_origin"에 대해 항상 / "$ http_origin"을 설정하면 모든 도메인에서의 CORS를 차단 해제합니다 (대신별 Concrete Page ADRES를 사용하여 API를 소비합니다)
위치 ~ ^ / index \ .php (/ | $) { ...에 ... ADD_HEADER '액세스 제어 - 허용 - 원점' "$ http_origin"; 항상; add_header '액세스 제어 - 허용 - 자격 증명' 'true'항상; if ($ request_method = 옵션) { add_header '액세스 제어 - 허용 - 원점 ""$ http_origin ";#이 선을 제거하지 마십시오 (위의 경우 외부로 두 배로). add_header '액세스 제어 - 허용 - 자격 증명' 'true'; add_header '액세스 제어 - 최대 연령대'1728000;# 20 일 동안 프리 플라이트 값을 캐시하십시오 add_header '액세스 제어 - 허용 - 메소드' '가져 오기, 게시물, 옵션'; ADD_HEADER '액세스 제어 - 허용 - 헤더'내 첫 번째 머리글, 내 두 번째 헤더, 권한 부여, 콘텐츠 형식, 수락, 원점 '; add_header 'content-length'0; add_header 'content-type' 'text / plain charset = UTF-8'; 반환 204; } }
apache (.htaccess 파일)에서 CORS를 켜는 예제 구성이 있습니다.
# --------------------------------------------------------------------------------------------
# | |크로스 도메인 Ajax 요청 |
# --------------------------------------------------------------------------------------------
# 교차 원본 Ajax 요청을 사용합니다.
# http://code.google.com/html5security/wiki/crossoriginrequestsecurity.
# http://enable-cors.org/
#
답변
CORS 제한을 적용하는 것은 서버에 의해 정의되고 브라우저가 구현 한 보안 기능입니다.
브라우저는 서버의 Cors 정책을보고 있습니다.
그러나 포스트 맨 도구는 서버의 CORS 정책에 대해 귀찮게하지 않습니다.
그래서 코어가 브라우저에 나타나지만 우체사가 아닌 이유입니다.
답변
귀하가받는 오류는 JavaScript가 Ajax 요청을 수행 할 수있는 방법에 대한 몇 가지 제한을 설정하는 Cors 표준 때문입니다.
CORS 표준은 브라우저에서 구현 된 클라이언트 측 표준입니다.따라서 호출이 완료되지 않도록하는 브라우저가 아니며 서버가 아닌 오류 메시지를 생성합니다.
우편원은 Postman에서 동일한 전화를 걸 때 동일한 오류가 보이지 않는 코어의 제한 사항을 구현하지 않습니다.
포스트먼이 코어를 구현하지 않는 이유는 무엇입니까?Cors는 요청을 시작하는 페이지의 원점 (URL 도메인)과 관련된 제한 사항을 정의합니다.그러나 우편 맨에서는 요청이 URL이있는 페이지에서 비롯되지 않습니다. 그래서 Cors가 적용되지 않습니다.
출처:https://stackoverflow.com/questions/20035101/why-does-my-javascript-code-receive-a-no-access-control-allow-origin-header-i
최근댓글