XMLHttpRequest Origin null은 file : /// to file : ///에 대한 Access-Control-Allow-Origin이 허용되지 않습니다 (서버리스).


209

색인 파일을 시작하여 로컬로 다운로드하여 실행할 수있는 웹 사이트를 만들려고합니다.

모든 파일이 로컬에 있으며 온라인에서 리소스가 사용되지 않습니다.

jQuery 용 AJAXSLT 플러그인을 사용하여 XSL 템플릿 (하위 디렉토리에있는)으로 XML 파일을 처리하려고하면 다음 오류가 발생합니다.

XMLHttpRequest cannot load file:///C:/path/to/XSL%20Website/data/home.xml. Origin null is not allowed by Access-Control-Allow-Origin.

XMLHttpRequest cannot load file:///C:/path/to/XSL%20Website/assets/xsl/main.xsl. Origin null is not allowed by Access-Control-Allow-Origin.

요청한 색인 파일은 file:///C:/path/to/XSL%20Website/index.html사용 된 JavaScript 파일이에 저장되어있는 동안입니다 file:///C:/path/to/XSL%20Website/assets/js/.

이 문제를 해결하려면 어떻게해야합니까?

답변:


177

로컬 웹 서버를 실행하는 것이 옵션이 아닌 경우 file://브라우저 스위치를 통해 Chrome이 파일에 액세스하도록 허용 할 수 있습니다 . 약간의 파기 후, 나는 이 토론을 발견 했다. 다음을 사용하여 Chrome 인스턴스를 실행하십시오.

chrome.exe --allow-file-access-from-files

이것은 개발 환경에는 적합하지만 그 밖의 것은 거의 없습니다. 당신은 확실히 이것을 항상 원하지 않습니다. 이것은 여전히 ​​공개 된 문제인 것으로 보입니다 (2011 년 1 월 기준).

참조 : Chrome에서 로컬 파일을 사용하는 jQuery getJSON 문제


1
@Rich, 그것이 기뻤습니다! 브라우저 기반 앱에 대한 Google의 노력으로 더 많은 수요가 있는지 궁금합니다. 수요는 계속 증가 할 것이라고 생각합니다.
Courtney Christensen

4
이것은 macs OS X cweagans.net/blog/2011/1/24/…
kinet

1
고마워, 내가 잘못 코딩 한 곳이 궁금합니다. 브라우저가 문제인 것 같습니다.
Arda

4
--allow-file-access-from-files로 인해 문제가 해결되지 않는 이유가 있습니까? 나는 단순히 $ .getScript ( "application.js")와 같은 스크립트 파일을로드하려고합니다. 질문에 설명 된 오류를 얻으십시오.
Denzo

1
그러나 "명령을 실행하기 전에 모든 Chrome 창이 닫혀 있고 달리 실행되고 있지 않은지 확인하십시오. 또는 명령 줄 매개 변수가 유효하지 않습니다."chrome.exe --allow-file-access-from- files ""( stackoverflow.com/a/4208455/1272428 )
rluks

87

본질적 으로이 문제를 해결하는 유일한 방법은 로컬 호스트에서 웹 서버를 실행하고 거기서 호스팅하는 것입니다.

브라우저가 ajax 요청이 컴퓨터의 모든 파일에 액세스하도록 허용하는 것은 안전하지 않으므로 대부분의 브라우저는 "file : //"요청을 " Same Origin Policy " 의 목적으로 원점이없는 것으로 간주합니다.

웹 서버를 시작하는 cd것은 파일이 있고 실행중인 디렉토리에 들어가는 것만 큼 ​​간단 할 수 있습니다 .

python -m SimpleHTTPServer

1
사용자가 웹 브라우저 이외의 것을 사용할 필요가없는 솔루션을 개발하기를 희망합니다. 파이썬, 인터프리터 또는 시스템에 구애받지 않는 소프트웨어를 사용하는 것은 불가능합니다.
Kevin Herrera

5
내가 생각할 수있는 유일한 다른 해결책은 파일 시스템에 대한 아약스 요청을 할 필요가 없도록 전체를 하나의 단일 페이지에로드하는 것입니다.
싱글 톤

2
@Singletoned 감사합니다! 귀하의 솔루션을 사용하고 있으며 매우 편리합니다!
Hendy Irawan

4
Python 3을 사용하는 경우 명령은입니다 python -m http.server.
alextercete

4

OSX / Chrome 개발자를 위해 --allow-file-access-from-files 스위치를 켜고 Chrome을 시작하는 Applescript는 다음과 같습니다.

set chromePath to POSIX path of "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"    
set switch to " --allow-file-access-from-files"
do shell script (quoted form of chromePath) & switch & " > /dev/null 2>&1 &"

14
open (1) 을 사용 하여 플래그를 추가 할 수 있습니다 open -a 'Google Chrome' --args --allow-file-access-from-files.
Josh Lee

4

이 솔루션을 사용하면 jQuery.getScript ()를 사용하여 로컬 스크립트를로드 할 수 있습니다. 이것은 전역 설정이지만 요청에 따라 crossDomain 옵션을 설정할 수도 있습니다.

$.ajaxPrefilter( "json script", function( options ) {
  options.crossDomain = true;
});

로컬 html 파일에서 로컬 js 파일을로드하는 매력처럼 작동했습니다! 고마워, 정확히 내가 필요한 것.
user1577390

4

사용에 대한 어떤 자바 스크립트을 FileReader의 로컬 파일, 즉 열 기능 :

<input type="file" name="filename" id="filename">
<script>
$("#filename").change(function (e) {
  if (e.target.files != undefined) {
    var reader = new FileReader();
    reader.onload = function (e) {
        // Get all the contents in the file
        var data = e.target.result; 
        // other stuffss................            
    };
    reader.readAsText(e.target.files.item(0));
  }
});
</script>

이제 Choose file버튼을 클릭하고 파일을 찾습니다file:///C:/path/to/XSL%20Website/data/home.xml


3

이 제한을 무시하려면 크롬을 시작하십시오 open -a "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --args --allow-file-access-from-files.

Josh Lee의 의견 에서 파생 되었지만 Google 파티션 (Parallels)에서 Chrome이 열리지 않도록 Chrome의 전체 경로를 지정해야했습니다.


2

방금 해결 한 방법은 XMLHTTPRequest를 전혀 사용하지 않고 대신 별도의 자바 스크립트 파일에 필요한 데이터를 포함시키는 것입니다. (제 경우에는 https://github.com/kripken/sql.js/ 와 함께 사용할 바이너리 SQLite Blob이 필요했습니다. )

나는라는 파일을 만들었고 base64_data.js( btoa()필요한 데이터를 변환하고 그것을 <div>복사 할 수 있도록 삽입하는 데 사용 되었습니다 )

var base64_data = "U1FMaXRlIGZvcm1hdCAzAAQA ...<snip lots of data> AhEHwA==";

그런 다음 일반 자바 스크립트와 같이 html에 데이터를 포함시킵니다.

<div id="test"></div>

<script src="base64_data.js"></script>
<script>
    data = atob(base64_data);
    var sqldb = new SQL.Database(data);
    // Database test code from the sql.js project
    var test = sqldb.exec("SELECT * FROM Genre");
    document.getElementById("test").textContent = JSON.stringify(test);
</script>

JSON을 읽고 XML을 읽도록 수정하는 것이 쉽지 않을 것이라고 생각합니다. 나는 그것을 독자를위한 연습으로 남겨 둘 것이다;)


1

당신은 퍼팅 시도 할 수 있습니다 'Access-Control-Allow-Origin':'*'에서 response.writeHead(, {[here]}).


6
response.writeHead는 어디에서 왔으며 어떻게 호출합니까? 더 많은 예를 들어 줄 수 있습니까? 이것은 서버가 아닌 로컬 파일 시스템입니다. 내 이해는 서버에서만 값을 설정할 수 있다는 것입니다.
Joseph Astrahan

0

'크롬 앱용 웹 서버'를 사용하십시오. (실제로 PC에 그것을 가지고 있는지 여부는 알 수 있습니다. cortana에서 검색하십시오!). 파일을 열고 '파일 선택'을 클릭하여 파일이 들어있는 폴더를 선택하십시오. 실제로 파일을 선택하지 마십시오. 파일 폴더를 선택하십시오 선택한 다음 '폴더 선택'버튼 아래의 링크를 클릭하십시오.

파일로 이동하지 않으면 파일 이름을 ur에 추가하십시오. 이처럼 :

   https://127.0.0.1:8887/fileName.txt

크롬 용 웹 서버 링크 : 클릭

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.