ชุดส่วนหัว Access-Control-Allow-Origin ใน. htaccess ไม่ทำงาน


91

ฉันคิดไม่ออกว่าทำไม.htaccessการตั้งค่าส่วนหัวของฉันจึงไม่ทำงาน

.htaccessเนื้อหาไฟล์ของฉัน:

Header set Access-Control-Allow-Origin *
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Allow-Headers "*"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]

แต่เมื่อฉันลบHeaderและเพิ่มเข้าไปindex.phpแล้วทุกอย่างก็ใช้ได้ดี

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: *");

ฉันขาดอะไรไป?

คำตอบ:


135

สิ่งนี้ควรใช้งานได้:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

46
อย่าลืมเปิดใช้งานส่วนหัวโมดูล apachea2enmod headers
Lucas Serafim

1
ได้รับการแก้ไข: "วิธีการ PUT ไม่ได้รับอนุญาตจาก Access-Control-Allow-Methods"
Rahul Prasad

6
นอกจากนี้ควรใช้Header setในกรณีนี้ หากรหัสมีการเปลี่ยนแปลงและตั้งค่าส่วนหัวให้ Apache ทำheader addจะส่งส่วนหัว ** สองครั้ง สิ่งนี้จะทำลายไคลเอนต์เช่น Restangular เป็นต้น
Julian

2
อย่าลืมถ้าจำเป็นHeader add Access-Control-Allow-Credentials "true"
Marco Marsala

20

สำหรับบันทึกฉันพบปัญหาเดียวกันและไม่มีคำตอบใดได้ผล

ฉันใช้เครื่องมือตรวจสอบส่วนหัว: http://www.webconfs.com/http-header-check.php

ฉันกำลังทดสอบกับ IP ของฉัน ( http://192.0.2.1/upload) และสิ่งที่กลับมามีดังต่อไปนี้:

HTTP/1.1 301 Moved Permanently => 
Date => Sat, 10 Jan 2015 04:03:35 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
Location => http://192.0.2.1/upload/
Content-Length => 380
Connection => close
Content-Type => text/html; charset=iso-8859-1

มีการเปลี่ยนเส้นทางเกิดขึ้นและคำขอ AJAX ไม่ให้เกียรติ / ติดตามการเปลี่ยนเส้นทาง

มันกลายเป็นเครื่องหมายทับที่ขาดหายไปในตอนท้ายของโดเมน ( http://192.0.2.1/upload / )

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

HTTP/1.1 200 OK => 
Date => Sat, 10 Jan 2015 04:03:53 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By => PHP/5.3.8
Access-Control-Allow-Origin => *
Access-Control-Allow-Methods => PUT, GET, POST, DELETE, OPTIONS
Access-Control-Allow-Headers => *
Content-Length => 1435
Connection => close
Content-Type => text/html

ใช้เครื่องมือนี้เพื่อทดสอบว่าส่วนหัวของคุณดีหรือไม่และเพื่อแก้ไขปัญหาที่เกิดขึ้น


5
ตอนนี้ฉันเปิดแท็บ 11 แท็บเพื่อพยายามแก้ปัญหานี้ คำตอบนี้ควรอยู่ในที่ต่างๆมากกว่านี้
JDavis

ด้วยของฉันฉันจำเป็นต้องลบเครื่องหมายทับ ดีใจจังที่ได้พบสิ่งนี้ ใช้เวลามากในการแก้ไขปัญหานี้เมื่อฉันใหม่ควรใช้เวลาทำงานหลายชั่วโมงที่แล้ว
gorelog

11

ฉันมีโฮสติ้งที่ใช้ร่วมกันบน GoDaddy ฉันต้องการคำตอบสำหรับคำถามนี้ด้วยและหลังจากค้นหารอบ ๆ ตัวฉันก็พบว่าเป็นไปได้

ฉันเขียนไฟล์. htaccess วางไว้ในโฟลเดอร์เดียวกับหน้าการทำงานของฉัน นี่คือเนื้อหาของไฟล์. htaccess:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

นี่คือการโทร ajax ของฉัน:

    $.ajax({
        url: 'http://www.mydomain.com/myactionpagefolder/gbactionpage.php',  //server script to process data
        type: 'POST',
        xhr: function() {  // custom xhr
            myXhr = $.ajaxSettings.xhr();
            if(myXhr.upload){ // check if upload property exists
                myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // for handling the progress of the upload
            }
            return myXhr;
        },
        //Ajax events
        beforeSend: beforeSendHandler,
        success: completeHandler,
        error: errorHandler,
        // Form data
        data: formData,
        //Options to tell JQuery not to process data or worry about content-type
        cache: false,
        contentType: false,
        processData: false
    });

ดูบทความนี้สำหรับการอ้างอิง:

ชุดส่วนหัว Access-Control-Allow-Origin ใน. htaccess ไม่ทำงาน


8

ระวัง:

 Header add Access-Control-Allow-Origin "*"

นี่ไม่ใช่เรื่องรอบคอบเลยที่จะให้สิทธิ์เข้าถึงแก่ทุกคน ขอแนะนำให้อนุญาตรายชื่อโฮสต์ที่เชื่อถือได้เท่านั้น ...

Header add Access-Control-Allow-Origin "http://aaa.example"
Header add Access-Control-Allow-Origin "http://bbb.example"
Header add Access-Control-Allow-Origin "http://ccc.example"

ความนับถือ,


4
วิธีนี้ใช้ไม่ได้ Access-Control-Allow-Origin ไม่อนุญาตให้มีหลายค่า คุณต้องตั้งค่าส่วนหัวแบบไดนามิกตามค่าของส่วนหัวคำขอ Origin
Quentin

7

ฉันเปิดใช้งานส่วนหัว a2enmod ของโมดูล Apache ส่วนหัวและปัญหาได้รับการแก้ไขแล้ว


ข้อผิดพลาดในบันทึกไม่ชัดเจนว่าเหตุใดการเปลี่ยนแปลงที่ฉันทำจึงล้มเหลวและคำตอบนี้ช่วยได้มาก sudo a2enmod headersและการรีสตาร์ททำให้มันใช้งานได้!
cchana

4

ลองใช้สิ่งนี้ใน. htaccess ของโฟลเดอร์รูทภายนอก

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

ข้อควรระวัง: ส่วนหัวให้เพิ่ม Access-Control-Allow-Origin "*" สิ่งนี้ไม่รอบคอบเลยในการให้สิทธิ์เข้าถึงแก่ทุกคน ฉันคิดว่าคุณควรใช้:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://example.com"
</IfModule>

3

ฉัน +1 คำตอบของ Miro สำหรับลิงก์ไปยังเว็บไซต์ตรวจสอบส่วนหัวhttp://www.webconfs.com/http-header-check.php http://www.webconfs.com/http-header-check.phpมันจะปรากฏโฆษณาที่น่ารังเกียจทุกครั้งที่คุณใช้งาน แต่อย่างไรก็ตามมันก็มีประโยชน์มากสำหรับการตรวจสอบการมีอยู่ของส่วนหัว Access-Control-Allow-Origin

ฉันกำลังอ่านไฟล์. json จากจาวาสคริปต์บนหน้าเว็บของฉัน ฉันพบว่าการเพิ่มสิ่งต่อไปนี้ในไฟล์. htaccess ของฉันช่วยแก้ปัญหาเมื่อดูหน้าเว็บของฉันใน IE 11 (เวอร์ชัน 11.447.14393.0):

<FilesMatch "\.(json)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

ฉันยังเพิ่มสิ่งต่อไปนี้ใน /etc/httpd.conf (ไฟล์กำหนดค่าของ Apache):

AllowOverride All

ไซต์ส่วนหัวตรวจสอบยืนยันว่าขณะนี้มีการส่งส่วนหัว Access-Control-Allow-Origin (ขอบคุณ Miro!)

อย่างไรก็ตาม Firefox 50.0.2, Opera 41.0.2353.69 และ Edge 38.14393.0.0 ทั้งหมดจะดึงไฟล์อย่างไรก็ตามแม้จะไม่มีส่วนหัว Access-Control-Allow-Origin ก็ตาม (หมายเหตุ: พวกเขาอาจกำลังตรวจสอบที่อยู่ IP เนื่องจากทั้งสองโดเมนที่ฉันใช้นั้นโฮสต์อยู่บนเซิร์ฟเวอร์เดียวกันที่ที่อยู่ IPv4 เดียวกัน)

อย่างไรก็ตาม Chrome 54.0.2840.99 ม. (64 บิต) จะละเว้นส่วนหัว Access-Control-Allow-Origin และล้มเหลว แต่อย่างใดรายงานผิดพลาด:

ไม่มีส่วนหัว "Access-Control-Allow-Origin" ในทรัพยากรที่ร้องขอ Origin " {mydomain} " จึงไม่ได้รับอนุญาตให้เข้าถึง

ฉันคิดว่านี่ต้องเป็น "อันดับแรก" IE ทำงานอย่างถูกต้อง Chrome, Firefox, Opera และ Edge ล้วนมีปัญหา และ Chrome เป็นที่เลวร้ายที่สุด นั่นไม่ใช่สิ่งที่ตรงกันข้ามกับกรณีปกติอย่างแน่นอน?


0

หลังจากใช้เวลาครึ่งวันโดยไม่มีอะไรทำงาน ใช้บริการตรวจสอบส่วนหัวแม้ว่าทุกอย่างจะทำงาน ไฟร์วอลล์ในที่ทำงานกำลังทำลายพวกเขา


0

ลองสิ่งนี้:

<IfModule mod_headers.c>
     Header set Access-Control-Allow-Credentials true
     Header set Access-Control-Allow-Origin "your domain"
     Header set Access-Control-Allow-Headers "X-Requested-With"
</IfModule>

ขอแนะนำให้ระบุรายชื่อโฮสต์ที่เชื่อถือได้


0

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

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