.Htaccess'teki Access-Control-Allow-Origin üstbilgi ayarı çalışmıyor


91

.htaccessBaşlık ayarlarımın neden çalışmadığını anlayamıyorum .

Benim .htaccessdosya içeriği:

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]

Ama Header'leri çıkarıp eklediğimde index.phpher şey yolunda gidiyor.

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

Neyi kaçırıyorum?

Yanıtlar:


135

Bu çalışmalı:

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
Apache modülü başlıklarını etkinleştirmeyi unutmayına2enmod headers
Lucas Serafim

1
Düzeltildi: "Yöntem PUT'a Erişim Kontrolü-İzin Verme Yöntemleri tarafından izin verilmiyor"
Rahul Prasad

6
Ayrıca, Header setbu durumda kullanmak en iyisidir . Kod değiştirilirse ve başlığı ayarlarsa, Apache'nin a yapması header addçift ​​** başlık gönderir. Bu, örneğin Restangular gibi istemcileri bozacaktır.
Julian

2
Gerekirse unutmayın,Header add Access-Control-Allow-Credentials "true"
Marco Marsala

20

Sadece kayıt için, aynı problemle karşılaşıyordum ve cevapların hiçbiri işe yaramadı.

Bir üstbilgi denetleme aracı kullandım: http://www.webconfs.com/http-header-check.php

IP ( http://192.0.2.1/upload) ile test ediyordum ve geri gelen şey şuydu:

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

Bir yönlendirme gerçekleşti ve AJAX isteği yönlendirmeleri kabul etmiyor / takip etmiyor.

Etki alanının sonunda eksik eğik çizgi olduğu ortaya çıktı ( http://192.0.2.1/upload / )

Sonunda eğik çizgi ile tekrar test ettim ve bunu aşağıdan aldım. Komut dosyasına da bir eğik çizgi eklendi ve şimdi çalışıyordu.

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

Başlıklarınızın iyi olup olmadığını test etmek ve olanları gidermek için bu aracı kullanın.


5
Şu anda bunu çözmeye çalışan 11 sekmem açık. Bu cevap daha çok yerde olmalı.
JDavis

Benimki ile sondaki eğik çizgiyi kaldırmam gerekiyordu. Bunu bulduğuma çok sevindim. Bunu yeni yaptığımda sorun gidermek için çok zaman harcadım, saatler önce çalışıyor olmalıydı.
gorelog

11

GoDaddy'de paylaşılan bir barındırma hizmetim var. Bu soruya da bir cevaba ihtiyacım vardı ve etrafı araştırdıktan sonra bunun mümkün olduğunu anladım.

Bir .htaccess dosyası yazdım, onu eylem sayfamla aynı klasöre koydum. .Htaccess dosyasının içeriği:

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"

İşte ajax çağrım:

    $.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
    });

Referans için bu makaleye bakın:

.Htaccess'teki Access-Control-Allow-Origin üstbilgi ayarı çalışmıyor


8

Dikkatli olun:

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

Bu, herkese erişim sağlamak için hiç mantıklı değil. Yalnızca bilinen güvenilir ana bilgisayarların bir listesine izin verilmesi tercih edilir ...

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"

Saygılarımızla,


3
Bu işe yaramayacak. Access-Control-Allow-Origin'e birden fazla değere izin verilmez. Başlığı, Origin istek başlığının değerine göre dinamik olarak ayarlamanız gerekir.
Quentin

7

Apache modülü başlıkları a2enmod başlıklarını etkinleştirdim ve sorun çözüldü.


Günlükteki hatalar, yaptığım değişikliklerin neden başarısız olacağı konusunda net değildi ve bu cevap çok yardımcı oldu. sudo a2enmod headersve yeniden başlatma işe yaradı!
cchana

3

Bunu harici kök klasörün .htaccess'inde deneyin

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

Dikkatli olun: Üstbilgi, Erişim-Kontrol-İzin Ver-Menşe ekle "*" Bu, herkese erişim sağlamak için hiç mantıklı değil. Bence şunları kullanmalısınız:

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

3

Miro'nun http://www.webconfs.com/http-header-check.php başlık denetleyicisi sitesine bağlantı için yanıtını + 1'ledim . Her kullandığınızda iğrenç bir reklam açar, ancak yine de Access-Control-Allow-Origin başlığının varlığını doğrulamak için çok kullanışlıdır.

Web sayfamda javascript'ten bir .json dosyası okuyorum. .Htaccess dosyama aşağıdakileri eklemenin, web sayfamı IE 11'de (sürüm 11.447.14393.0) görüntülerken sorunu çözdüğünü fark ettim:

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

Ayrıca /etc/httpd.conf'a (Apache'nin yapılandırma dosyası) şunu ekledim:

AllowOverride All

Üstbilgi denetleyicisi sitesi, Access-Control-Allow-Origin başlığının şimdi gönderildiğini doğruladı (teşekkürler, Miro!).

Bununla birlikte, Firefox 50.0.2, Opera 41.0.2353.69 ve Edge 38.14393.0.0 , Access-Control-Allow-Origin başlığı olmasa bile dosyayı bir şekilde alır . (Not: Kullandığım iki etki alanı aynı sunucuda, aynı IPv4 adresinde barındırıldığından, IP adreslerini kontrol ediyor olabilirler.)

Ancak, Chrome 54.0.2840.99 m (64-bit), Access-Control-Allow-Origin başlığını yok sayar ve yine de başarısız olur ve hatalı bir şekilde rapor verir:

İstenen kaynakta 'Access-Control-Allow-Origin' başlığı yok. Bu nedenle ' {alanım} ' kaynağına erişime izin verilmiyor.

Bunun bir çeşit "ilk" olması gerektiğini düşünüyorum. IE düzgün çalışıyor; Chrome, Firefox, Opera ve Edge hepsi bozuk; ve Chrome en kötüsü . Bu normal durumun tam tersi değil mi?


0

Hiçbir şey çalışmadan yarım gün geçirdikten sonra. Her şey çalışıyor olsa da bir başlık kontrol hizmeti kullanmak. İş yerindeki güvenlik duvarı onları soyuyordu


0

bunu dene:

<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>

Bilinen güvenilir ana bilgisayar listesine izin vermek tercih edilir.


0

Başka biri bunu deniyorsa, en çok verilen cevap işe yaramalıdır. Ancak, sorun yaşıyorsanız, tarayıcının İSTEĞİ önbelleğe almış olması olasıdır. Bir sorgu dizesinin eklenmesini onaylamak için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.