Berdasarkan jawaban DaveRandom , saya juga bermain-main dan menemukan solusi Apache yang sedikit lebih sederhana yang menghasilkan hasil yang sama ( Access-Control-Allow-Origin
diatur ke protokol + domain + port saat ini secara dinamis) tanpa menggunakan aturan penulisan ulang:
SetEnvIf Origin ^(https?://.+\.mywebsite\.com(?::\d{1,5})?)$ CORS_ALLOW_ORIGIN=$1
Header append Access-Control-Allow-Origin %{CORS_ALLOW_ORIGIN}e env=CORS_ALLOW_ORIGIN
Header merge Vary "Origin"
Dan itu saja.
Mereka yang ingin mengaktifkan CORS di domain induk (mis. Mywebsite.com) di samping semua subdomainnya dapat dengan mudah mengganti ekspresi reguler di baris pertama dengan yang ini:
^(https?://(?:.+\.)?mywebsite\.com(?::\d{1,5})?)$
.
Catatan: Untuk kepatuhan spesifikasi dan perilaku cache yang benar, SELALU menambahkan Vary: Origin
tajuk respons untuk sumber daya yang mendukung CORS, bahkan untuk permintaan non-CORS dan yang dari asal yang tidak diizinkan (lihat contoh mengapa ).
//
konteks ini, karena conf Apache tidak menggunakan ekspresi reguler terbatas-slash. Regexr mengeluh karena, dalam konteks itu, garis miring memiliki arti khusus sebagai pembatas.The 'Access-Control-Allow-Origin' header contains multiple values '^(https?://(?:.+.)?aerofotea.com(?::d{1,5})?)$', but only one is allowed. Origin 'http://local.aerofotea.com' is therefore not allowed access.
Spesifikasi CORS semuanya atau tidak sama sekali. Ini hanya mendukung
*
,null
atau protokol + domain + port yang tepat: http://www.w3.org/TR/cors/#access-control-allow-origin-response-headerServer Anda perlu memvalidasi header asal menggunakan regex, dan kemudian Anda bisa menggemakan nilai asal di header respons Access-Control-Allow-Origin.
sumber
EDIT : Gunakan solusi @ Noyo bukan yang ini. Ini lebih sederhana, lebih jelas dan kemungkinan jauh lebih banyak performan di bawah beban.
KIRI JAWABAN ASLI DI SINI UNTUK TUJUAN SEJARAH SAJA !!
Saya melakukan beberapa masalah dengan masalah ini dan muncul dengan solusi .htaccess (atau httpd.conf) yang dapat digunakan kembali ini yang bekerja dengan Apache:
Cukup setel
ACCESS_CONTROL_ROOT
variabel di bagian atas blok ke domain root Anda dan itu akan menggemakan nilaiOrigin:
header permintaan kembali ke klien dalam nilaiAccess-Control-Allow-Origin:
header respons jika cocok dengan domain Anda.Perhatikan juga bahwa Anda dapat menggunakan
sub.mydomain.com
sebagaiACCESS_CONTROL_ROOT
dan itu akan membatasi asalsub.mydomain.com
dan*.sub.mydomain.com
(yaitu tidak harus menjadi root domain). Elemen-elemen yang diizinkan bervariasi (protokol, port) dapat dikontrol dengan memodifikasi bagian pencocokan URI dari regex.sumber
Saya menjawab pertanyaan ini, karena jawaban yang diterima tidak dapat mengikuti
Misalnya: Ia tidak akan mengirim header CORS untuk http://mywebsite.com, sementara berfungsi untuk http://somedomain.mywebsite.com/
Untuk mengaktifkan situs Anda, Anda cukup meletakkan situs Anda di tempat "mywebsite.com" di Konfigurasi Apache di atas.
Untuk mengizinkan Beberapa situs:
Pengujian Setelah penggelaran:
Respons ikal berikut harus memiliki tajuk "Access-Control-Allow-Origin" setelah perubahan.
sumber
Saya membutuhkan solusi PHP saja, jadi kalau-kalau ada yang membutuhkannya juga. Dibutuhkan string input yang diizinkan seperti "* .example.com" dan mengembalikan nama server header permintaan, jika inputnya cocok.
Dan berikut ini adalah kasus uji untuk penyedia data phpunit:
sumber
preg_quote()
karena itulah cara yang benar untuk melakukannya (meskipun.
satu-satunya meta char regexp valid dalam nama DNS,preg_quote()
menjelaskan operasi yang dimaksud lebih baik)none
bukan nilai semantik yang valid untuk header (atau setidaknya, tidak melakukan apa yang disiratkan) sesuai dengan spesifikasi. Dengan demikian,return null;
mungkin lebih masuk akal untuk cabang itu, dan dalam hal itu tidak ada header yang harus dikirim ke klien, sehingga harus diperiksa oleh pemanggil.preg_quote()
akan mengutip tanda * dan jadistr_replace()
misalnya meninggalkan "y" yatim piatu.Saat mengatur
Access-Control-Allow-Origin
dalam .htaccess, hanya yang berikut yang berfungsi:Aku mencoba beberapa kata kunci yang disarankan lainnya
Header append
,Header set
, tidak bekerja seperti yang disarankan di banyak jawaban pada SO, meskipun saya tidak tahu apakah kata kunci tersebut sudah ketinggalan jaman atau tidak berlaku untuk nginx .Inilah solusi lengkap saya:
sumber
Kami mengalami masalah serupa dengan Font Awesome pada domain "cookie-kurang" statis ketika membaca font dari "domain cookie" (www.domain.tld) dan posting ini adalah pahlawan kami. Lihat di sini: Bagaimana saya dapat memperbaiki masalah webfont 'Header Berbagi Sumber Daya Hilang (CORS) yang Hilang?
Untuk tipe salin / tempel-r (dan untuk memberikan beberapa alat peraga) saya mengumpulkan ini bersama-sama dari semua kontribusi dan menambahkannya ke bagian atas file .htaccess dari root situs:
Super Aman, Super Elegan. Senang: Anda tidak perlu membuka bandwidth server Anda untuk sumber daya jenis pencuri / hot-link-er.
Props untuk: @Noyo @DaveRandom @ pratap-koritala
(Saya mencoba meninggalkan ini sebagai komentar untuk jawaban yang diterima, tetapi saya belum bisa melakukannya)
sumber
Untuk Spring Boot saya menemukan ini
RegexCorsConfiguration
yang meluas resmiCorsConfiguration
: https://github.com/looorent/spring-security-jwt/blob/master/src/main/java/be/looorent/security/jwt/RegexCorsConfiguration.javasumber
Sepertinya jawaban asli untuk pra Apache 2.4. Itu tidak berhasil untuk saya. Inilah yang harus saya ubah untuk membuatnya bekerja di 2.4. Ini akan berfungsi untuk kedalaman subdomain dari perusahaanAnda .
sumber
Saya harus memodifikasi jawaban Lars sedikit, karena seorang yatim
\
berakhir di regex, untuk hanya membandingkan host yang sebenarnya (tidak memperhatikan protokol atau port) dan saya ingin mendukunglocalhost
domain selain domain produksi saya. Jadi saya mengubah$allowed
parameter menjadi array.Penggunaan sebagai berikut:
sumber
dalam kasus saya menggunakan sudut
di interseptor HTTP saya, saya atur
di tajuk permintaan
sumber