ไม่อนุญาตให้ใช้ XMLHttpRequest Origin Null สำหรับ Access-Control-Allow-Origin สำหรับไฟล์: /// ไปที่ file: /// (Serverless)


209

ฉันกำลังพยายามสร้างเว็บไซต์ที่สามารถดาวน์โหลดและรันภายในเครื่องได้โดยเปิดไฟล์ดัชนี

ไฟล์ทั้งหมดเป็นไฟล์ในเครื่องไม่มีทรัพยากรที่ใช้งานออนไลน์

เมื่อฉันพยายามใช้ปลั๊กอิน AJAXSLT สำหรับ jQuery เพื่อประมวลผลไฟล์ XML ด้วยเทมเพลต XSL (ในไดเรกทอรีย่อย) ฉันได้รับข้อผิดพลาดดังต่อไปนี้:

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

สำหรับอินสแตนซ์ที่ใช้งานเว็บเซิร์ฟเวอร์ในพื้นที่ไม่ใช่ตัวเลือกคุณสามารถอนุญาตให้ Chrome เข้าถึงfile://ไฟล์ผ่านสวิตช์ของเบราว์เซอร์ หลังจากการขุดฉันพบการสนทนานี้ซึ่งกล่าวถึงสวิตช์ของเบราว์เซอร์ในการเปิดโพสต์ เรียกใช้อินสแตนซ์ Chrome ของคุณด้วย:

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

สิ่งนี้อาจยอมรับได้สำหรับสภาพแวดล้อมการพัฒนา แต่อย่างอื่น แน่นอนว่าคุณไม่ต้องการสิ่งนี้ตลอดเวลา ปัญหานี้ยังคงเป็นปัญหาเปิดอยู่ (ณ เดือนมกราคม 2554)

ดูเพิ่มเติม: ปัญหาเกี่ยวกับ jQuery getJSON โดยใช้ไฟล์ในเครื่องใน Chrome


1
@ ริชดีใจที่ได้ช่วย! ฉันสงสัยว่าจะมีความต้องการสิ่งนี้มากขึ้นหรือไม่หาก 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- ไฟล์ "" ( stackoverflow.com/a/4208455/1272428 )
rluks

87

เป็นหลักวิธีเดียวที่จะจัดการกับเรื่องนี้คือการมีเว็บเซิร์ฟเวอร์ทำงานบน localhost และให้บริการจากที่นั่น

เบราว์เซอร์ไม่ปลอดภัยที่จะอนุญาตให้ ajax ร้องขอการเข้าถึงไฟล์ใด ๆ บนคอมพิวเตอร์ของคุณดังนั้นเบราว์เซอร์ส่วนใหญ่จึงดูเหมือนว่าจะทำการร้องขอ "file: //" เนื่องจากไม่มีต้นกำเนิดสำหรับวัตถุประสงค์ของ " นโยบายแหล่งกำเนิดเดียวกัน "

การเริ่มต้นเว็บเซิร์ฟเวอร์อาจไม่สำคัญเท่ากับการcdเข้าสู่ไดเรกทอรีไฟล์ที่อยู่และทำงานอยู่:

python -m SimpleHTTPServer

1
ฉันหวังว่าจะพัฒนาโซลูชันที่ไม่ต้องการให้ผู้ใช้ใช้อะไรมากกว่าเว็บเบราว์เซอร์ของพวกเขา การใช้ Python ล่ามหรือซอฟต์แวร์ใด ๆ ที่ไม่เชื่อเรื่องพระเจ้าไม่สามารถใช้การได้
Kevin Herrera

5
วิธีแก้ปัญหาอื่น ๆ ที่ฉันคิดได้คือการโหลดทุกสิ่งในหน้าเดียวเพื่อที่คุณจะได้ไม่ต้องทำการร้องขอ ajax ใด ๆ กับระบบไฟล์
Singletoned

2
ขอบคุณ @Singletoned! ฉันใช้โซลูชันของคุณและมันมีประโยชน์มาก!
Hendy Irawan

4
และถ้าคุณใช้ Python 3 คำสั่งก็จะเป็นpython -m http.serverเช่นนั้น
alextercete

4

นี่คือแอปพลิเคชันที่จะเปิดใช้งาน Chrome โดยเปิดสวิตช์ --allow-access-access-from-files ไว้สำหรับ OSX / Chrome เป็นเครื่องมือออก:

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
คุณก็สามารถใช้เปิด (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;
});

ทำงานเหมือนมีเสน่ห์สำหรับการโหลดไฟล์ js ท้องถิ่นจากไฟล์ html ในท้องถิ่น! ขอบคุณสิ่งที่ฉันต้องการ
user1577390

4

สิ่งที่เกี่ยวกับการใช้ฟังก์ชั่นjavascript 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

เปิดตัว Chrome เพื่อหลีกเลี่ยงข้อ จำกัด นี้: open -a "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --args --allow-file-access-from-files.

มาจากความคิดเห็นของ Josh Leeแต่ฉันต้องระบุเส้นทางแบบเต็มไปยัง Google Chrome เพื่อหลีกเลี่ยงการเปิด Google Chrome จากพาร์ติชัน Windows ของฉัน (ใน Parallels)


2

วิธีที่ฉันเพิ่งแก้ไขสิ่งนี้ไม่ได้ใช้ XMLHTTPRequest เลย แต่รวมถึงข้อมูลที่จำเป็นในไฟล์ javascript แยกต่างหากแทน (ในกรณีของฉันฉันต้องการไบนารี SQLite blob เพื่อใช้กับhttps://github.com/kripken/sql.js/ )

ฉันสร้างไฟล์ชื่อbase64_data.js(และใช้btoa()ในการแปลงข้อมูลที่ฉันต้องการและแทรกลงใน<div>ดังนั้นฉันสามารถคัดลอกได้)

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

แล้วรวมข้อมูลใน html เช่น javascript ปกติ:

<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

ใช้ 'เว็บเซิร์ฟเวอร์สำหรับแอป Chrome' (คุณมีในพีซีของคุณจริง ๆ คุณรู้หรือไม่แค่ค้นหาใน Cortana!) เปิดและคลิก 'เลือกไฟล์' เลือกโฟลเดอร์พร้อมไฟล์ของคุณ อย่าเลือกไฟล์ของคุณ เลือกโฟลเดอร์ไฟล์ของคุณจากนั้นคลิกที่ลิงก์ใต้ปุ่ม 'เลือกโฟลเดอร์'

หากไม่นำคุณไปยังไฟล์ให้เพิ่มชื่อของไฟล์ลงใน urs แบบนี้:

   https://127.0.0.1:8887/fileName.txt

ลิงก์ไปยังเว็บเซิร์ฟเวอร์สำหรับ chrome: คลิกฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.