htaccess Access-Control-Allow-Origin


134

ฉันกำลังสร้างสคริปต์ที่โหลดจากภายนอกในไซต์อื่น ๆ โหลด CSS และ HTML และทำงานได้ดีบนเซิร์ฟเวอร์ของฉันเอง

อย่างไรก็ตามเมื่อฉันลองใช้บนเว็บไซต์อื่นมันแสดงข้อผิดพลาดที่น่ากลัวนี้:

Access-Control-Allow-Origin

ที่นี่คุณสามารถดูโหลดได้อย่างสมบูรณ์: http://tzook.info/bot/

แต่ในเว็บไซต์อื่นนี้แสดงข้อผิดพลาด: http://cantloseweight.co/robot/

ฉันอัปโหลดสคริปต์การโหลดไปที่ jsfiddle: http://jsfiddle.net/TL5LK/

ฉันลองแก้ไขไฟล์ htaccess ดังนี้:

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

หรือเช่นนี้:

Header set Access-Control-Allow-Origin *

แต่มันยังไม่ได้ผล

คำตอบ:


270

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

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

และหากเกี่ยวข้องกับสคริปต์. js เท่านั้นคุณควรรวมโค้ดด้านบนไว้ในนี้:

<FilesMatch "\.(js)$">
...
</FilesMatch>

6
FilesMatchคำแนะนำที่ดีเกี่ยวกับการใช้
เนท

1
ถ้าเราจับคู่ไฟล์โดยเพิ่มบล็อก filesmatch แล้วจะ*ทำอย่างไร?
shenkwen

และฉันต้องรีสตาร์ทเซิร์ฟเวอร์หลังจากทำสิ่งนี้หรือไม่? ฉันใช้รหัสด้านบน แต่ยังไม่ยอมให้ฉันเข้าถึง \ .json ฉันเปลี่ยนjsเป็นjson.
shenkwen

3
@shenkwen *อนุญาตให้โดเมนต้นทางเข้าถึงทรัพยากรนี้ ไม่ใช่รายการทรัพยากร แต่เป็นรายการโดเมนที่อ้างอิง
SparK

3
ในกรณีที่ไม่ได้ผลคุณควรลองเปิดใช้งานheadersโมดูล:a2enmod headers
Joaquín O

53

ไม่มีใครบอกว่าคุณต้องเปิดใช้งานmod_headersด้วยดังนั้นหากยังใช้งานไม่ได้ให้ลองทำดังนี้:

(เคล็ดลับต่อไปนี้ใช้ได้กับ Ubuntu ไม่รู้เกี่ยวกับการแจกแจงอื่น ๆ )

คุณสามารถตรวจสอบรายการโมดูลที่โหลดด้วยไฟล์

apache2ctl -M

เพื่อเปิดใช้งาน mod_headers ที่คุณสามารถใช้ได้

a2enmod headers

แน่นอนหลังจากการเปลี่ยนแปลงใด ๆ ใน Apache คุณต้องรีสตาร์ท:

/etc/init.d/apache2 restart

จากนั้นคุณสามารถใช้

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

และถ้า mod_headers ไม่ทำงานบรรทัดนี้จะไม่ทำอะไรเลย คุณสามารถลองข้ามถ้าอนุประโยคและเพิ่มHeader set Access-Control-Allow-Origin "*"ในการกำหนดค่าของคุณจากนั้นควรส่งข้อผิดพลาดระหว่างการเริ่มต้นหาก mod_headers ไม่ทำงาน


3
พยายามใช้ตัวเลือกทั้งหมดที่ฉันพบใน Google และอย่างที่คุณบอกไม่มีใครพูดอะไรเกี่ยวกับ mod_headers ขอบคุณ!
Sirkong

1
mod_headers ของฉันใช้งานอยู่และเพิ่มบรรทัดนี้ใน. htaccess (ที่เดียวกับที่กล่าวถึง) แต่ยังคงได้รับข้อผิดพลาดนี้: การตอบสนองสำหรับ preflight มีรหัสสถานะ HTTP 400 ที่ไม่ถูกต้อง .. ขอแนะนำ!
Sushivam

1
mod_headers คือสิ่งที่ขาดหายไป! สิ่งนี้ทำงานได้อย่างสมบูรณ์กับกฎ. htaccess ขอบคุณ.
Andy

@SachinS ไม่พบข้อผิดพลาด 400, 500 เป็นข้อผิดพลาดของเซิร์ฟเวอร์ เริ่มต้นที่นั่น
Andy

30

จากประสบการณ์ของฉัน;

ถ้ามันไม่ได้ผลจากภายในการphpทำเช่นนี้.htaccessได้ผลสำหรับฉัน

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin http://www.vknyvz.com  
    Header set Access-Control-Allow-Credentials true
</IfModule>
  • ข้อมูลรับรองอาจเป็นจริงหรือเท็จขึ้นอยู่กับพารามิเตอร์คำขอ ajax ของคุณ

สิ่งนี้ไม่ได้ผลสำหรับฉัน แต่ฉันสามารถทำให้มันทำงานใน php หลักการเดียวกันได้
RevNoah

16

เพิ่ม.htaccessไฟล์ที่มีคำสั่งต่อไปนี้ไปยังโฟลเดอร์ฟอนต์ของคุณหากมีปัญหาในการเข้าถึงฟอนต์ของคุณ สามารถแก้ไขเพื่อใช้กับไฟล์. cssหรือ. jsได้อย่างง่ายดาย

<FilesMatch "\.(eot|ttf|otf|woff)$">
    Header set Access-Control-Allow-Origin "*"
</FilesMatch>

1
มันควรจะตั้งข้อสังเกตว่าข้างต้น<FilesMatch>สั่งไม่จำเป็นถ้าตามที่แนะนำข้างต้นของ.htaccessไฟล์ในไดเรกทอรีแบบอักษรของคุณและไดเรกทอรีแบบอักษรของคุณเท่านั้นที่มี.eot, ttf, .otfและ / หรือ.woffไฟล์
Mesagoma

9

คำตอบอื่น ๆ ไม่ได้ผลสำหรับฉันนี่คือสิ่งที่ลงเอยด้วยการทำเคล็ดลับสำหรับ apache2:

1) เปิดใช้งาน mod ส่วนหัว:

sudo a2enmod headers

2) สร้าง/etc/apache2/mods-enabled/headers.confไฟล์และแทรก:

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

3) รีสตาร์ทเซิร์ฟเวอร์ของคุณ:

sudo service apache2 restart


นี่เป็นทางออกเดียวที่ใช้ได้กับฉันบนเซิร์ฟเวอร์ Ubuntu 16.10 ของฉัน
เข่า

สิ่งนี้ใช้ได้ผลกับฉันด้วย ฉันใช้เซิร์ฟเวอร์ Ubuntu 16.04 ขอบคุณ.
jhedm

ทำงานให้ฉันบน Ubuntu 18.04 Firefox 70.0.1 ไม่พอใจกับแค่ส่วนหัว Access-Control-Allow-Origin และฉันต้องเพิ่ม Access-Control-Allow-Methods ด้วย
borizzzzz

@songololo ฉันไม่พบไฟล์นี้สำหรับ apache ใน Centos 7 ฉันดูทุกที่ในไดเร็กทอรี / etc / httpd คุณช่วยแจ้งให้เราทราบได้ไหมว่าฉันจะติดตั้งบน Centos
Mainuddin

@Mainuddin ขอโทษฉันไม่คุ้นเคยกับ Centos หวังว่าจะมีคนอื่นเข้ามาได้นะ
songololo

7

ใน Zend Framework 2.0 ฉันมีปัญหานี้ สามารถแก้ไขได้สองวิธี. htaccess หรือ php header ฉันชอบ. htaccess ดังนั้นฉันจึงแก้ไข. htaccess จาก:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

ถึง

RewriteEngine On

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

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

และเริ่มทำงาน


สิ่งนี้ช่วยชีวิตฉันวันทำงาน php couddnt ดังนั้น htaccess ก็ทำมัน
Relm

4

BTW: ต้องกำหนดค่า. htaccess บนเซิร์ฟเวอร์ที่โฮสต์ API ตัวอย่างเช่นคุณสร้างแอป AngularJS บนโดเมน x.com และสร้าง Rest API บน y.com คุณควรตั้งค่า Access-Control-Allow-Origin "*" ในไฟล์. htaccess ในโฟลเดอร์รากของ y.com ไม่ใช่ x .com :)

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

ตามที่ Lukas กล่าวถึงตรวจสอบให้แน่ใจว่าคุณได้เปิดใช้งาน mod_headers หากคุณใช้ Apache


1

ตรวจสอบให้แน่ใจว่าคุณไม่มีการเปลี่ยนเส้นทางเกิดขึ้น กรณีนี้อาจเกิดขึ้นได้หากคุณไม่ใส่เครื่องหมายทับใน URL

ดูคำตอบนี้สำหรับรายละเอียดเพิ่มเติม - https://stackoverflow.com/a/27872891/614524


0

หากโฮสต์ของคุณไม่ได้อยู่ที่ pvn หรือเฉพาะเป็นสิ่งสำคัญในการรีสตาร์ทเซิร์ฟเวอร์

ทางออกที่ดีกว่าจากฉันเพียงแก้ไขไฟล์ CSS ของคุณ (ที่โดเมนอื่นหรือโดเมนย่อยของคุณ) ที่เรียก font eot, woff และอื่น ๆ ไปยังต้นทางของคุณ (โดเมนของคุณหรือ www yourdomain) มันจะแก้ปัญหาของคุณ.

ฉันหมายถึงแก้ไข url สัมพัทธ์ใน css เป็นโดเมนต้นทางของ URL ที่สมบูรณ์

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