Kumpulan header Access-Control-Allow-Origin di .htaccess tidak berfungsi

91

Saya tidak tahu mengapa .htaccesspengaturan header saya tidak berfungsi.

.htaccessIsi file saya :

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]

Tapi ketika saya menghapus Headerdan menambahkannya index.phpmaka semuanya bekerja dengan baik.

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

Apa yang saya lewatkan?

pengguna1401592
sumber

Jawaban:

135

Ini harus bekerja:

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"
imbrizi
sumber
46
Jangan lupa untuk mengaktifkan header modul apachea2enmod headers
Lucas Serafim
1
Memperbaiki: "Metode PUT tidak diizinkan oleh Access-Control-Allow-Methods"
Rahul Prasad
6
Juga, yang terbaik adalah digunakan Header setdalam kasus ini. Jika kode diubah dan TIDAK mengatur header, meminta Apache melakukan a header addakan mengirimkan header ** ganda. Ini akan merusak klien seperti Restangular misalnya.
Julian
2
Jangan lupa, jika perlu,Header add Access-Control-Allow-Credentials "true"
Marco Marsala
20

Sekadar catatan, saya mengalami masalah yang sama persis dan tidak ada jawaban yang berhasil.

Saya menggunakan alat pemeriksa header: http://www.webconfs.com/http-header-check.php

Saya sedang menguji dengan IP saya ( http://192.0.2.1/upload) dan yang kembali adalah sebagai berikut:

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

Terjadi pengalihan dan permintaan AJAX tidak mematuhi / mengikuti pengalihan.

Ternyata ada garis miring yang hilang di akhir domain ( http://192.0.2.1/upload / )

Saya menguji lagi dengan garis miring di akhir dan saya mendapatkan ini di bawah. Menambahkan garis miring di skrip juga, dan sekarang berfungsi.

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

Gunakan alat ini untuk menguji apakah tajuk Anda bagus dan untuk memecahkan masalah yang terjadi.

Miro
sumber
5
Saya memiliki 11 tab yang terbuka sekarang mencoba menyelesaikan ini. Jawaban ini harus ada di lebih banyak tempat.
JDavis
Dengan milikku, aku perlu menghapus garis miring. Senang saya menemukan ini. Menghabiskan begitu banyak waktu untuk memecahkan masalah ini ketika saya baru itu seharusnya bekerja berjam-jam yang lalu.
gorelog
11

Saya memiliki hosting bersama di GoDaddy. Saya membutuhkan jawaban untuk pertanyaan ini juga, dan setelah mencari di sekitar saya menemukan bahwa itu mungkin.

Saya menulis file .htaccess, meletakkannya di folder yang sama dengan halaman tindakan saya. Berikut isi dari file .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"

Ini panggilan ajax saya:

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

Lihat artikel ini untuk referensi:

Kumpulan header Access-Control-Allow-Origin di .htaccess tidak berfungsi

TARKUS
sumber
8

Hati-hati pada:

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

Ini sama sekali tidak bijaksana untuk memberikan akses kepada semua orang. Lebih baik mengizinkan daftar host tepercaya yang tahu saja ...

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"

Salam,

Alex
sumber
3
Ini tidak akan berhasil. Access-Control-Allow-Origin tidak mengizinkan beberapa nilai. Anda perlu menyetel header secara dinamis berdasarkan nilai header permintaan Origin.
Quentin
7

Saya mengaktifkan header modul Apache a2enmod header, dan masalah telah diselesaikan.

truthblue82
sumber
Kesalahan dalam log tidak begitu jelas mengapa perubahan yang saya buat akan gagal dan jawaban ini sangat membantu. sudo a2enmod headersdan restart membuatnya bekerja!
cchana
3

Coba ini di .htaccess dari folder root eksternal

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

Berhati-hatilah: Tambahkan header Access-Control-Allow-Origin "*" Ini sama sekali tidak bijaksana untuk memberikan akses kepada semua orang. Saya pikir Anda harus menggunakan:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://example.com"
</IfModule>
Vo Quoc Cuong
sumber
3

Saya memberi jawaban Miro +1 untuk tautan ke situs pemeriksa tajuk http://www.webconfs.com/http-header-check.php . Itu memunculkan iklan yang menjengkelkan setiap kali Anda menggunakannya, tetapi, bagaimanapun, sangat berguna untuk memverifikasi keberadaan tajuk Access-Control-Allow-Origin.

Saya membaca file .json dari javascript di halaman web saya. Saya menemukan bahwa menambahkan yang berikut ini ke file .htaccess saya memperbaiki masalah saat melihat halaman web saya di IE 11 (versi 11.447.14393.0):

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

Saya juga menambahkan yang berikut ini ke /etc/httpd.conf (file konfigurasi Apache):

AllowOverride All

Situs pemeriksa header memverifikasi bahwa header Access-Control-Allow-Origin sekarang sedang dikirim (terima kasih, Miro!).

Namun, Firefox 50.0.2, Opera 41.0.2353.69, dan Edge 38.14393.0.0 semuanya mengambil file tersebut, bahkan tanpa header Access-Control-Allow-Origin. (Catatan: mereka mungkin memeriksa alamat IP, karena dua domain yang saya gunakan dihosting di server yang sama, di alamat IPv4 yang sama.)

Namun, Chrome 54.0.2840.99 m (64-bit) mengabaikan header Access-Control-Allow-Origin dan bagaimanapun juga gagal, melaporkan secara keliru:

Tidak ada header 'Access-Control-Allow-Origin' yang ada di resource yang diminta. Oleh karena itu, asal ' {mydomain} ' tidak diizinkan untuk diakses.

Saya pikir ini harus menjadi semacam "pertama." IE bekerja dengan benar; Chrome, Firefox, Opera dan Edge semuanya bermasalah; dan Chrome adalah yang terburuk . Bukankah itu kebalikan dari kasus biasa?

Dave Burton
sumber
0

Setelah menghabiskan setengah hari tanpa pekerjaan. Menggunakan layanan pemeriksaan tajuk meskipun semuanya berfungsi. Firewall sedang melucuti mereka

Matt di Washington
sumber
0

coba ini:

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

Lebih baik mengizinkan daftar host tepercaya yang diketahui.

behnam shateri
sumber
0

Jika ada orang lain yang mencoba ini, jawaban yang paling disukai akan berfungsi. Namun, jika Anda mengalami masalah, mungkin saja browser telah menyimpan PERMINTAAN dalam cache. Untuk mengonfirmasi menambahkan string kueri.

Simon Song
sumber