Pertanyaan Access-Control-Allow-Origin Multiple Origin Domains?


Apakah ada cara untuk memungkinkan beberapa lintas-domain menggunakan Access-Control-Allow-Origin tajuk?

Saya sadar akan hal itu *, tapi itu terlalu terbuka. Saya benar-benar ingin mengizinkan hanya beberapa domain.

Sebagai contoh, sesuatu seperti ini:

Access-Control-Allow-Origin: http://domain1.example, http://domain2.example

Saya telah mencoba kode di atas tetapi tampaknya tidak berfungsi di Firefox.

Apakah mungkin untuk menentukan beberapa domain atau saya hanya terjebak dengan satu domain?


837
2017-10-31 03:27


asal


Jawaban:


Kedengarannya seperti cara yang disarankan untuk melakukannya adalah agar server Anda membaca tajuk Asal dari klien, bandingkan dengan daftar domain yang ingin Anda izinkan, dan jika cocok, gema nilai dari Origin kembali ke klien sebagai Access-Control-Allow-Origin tajuk dalam tanggapan.

Dengan .htaccess Anda dapat melakukannya seperti ini:

# ----------------------------------------------------------------------
# Allow loading of external fonts
# ----------------------------------------------------------------------
<FilesMatch "\.(ttf|otf|eot|woff)$">
    <IfModule mod_headers.c>
        SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.example|dev02.otherdomain.example)$" AccessControlAllowOrigin=$0
        Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
    </IfModule>
</FilesMatch>

724
2017-12-05 00:10



Solusi lain yang saya gunakan dalam PHP:

$http_origin = $_SERVER['HTTP_ORIGIN'];

if ($http_origin == "http://www.domain1.com" || $http_origin == "http://www.domain2.com" || $http_origin == "http://www.domain3.com")
{  
    header("Access-Control-Allow-Origin: $http_origin");
}

165
2017-09-17 10:49



Ini berhasil untuk saya:

SetEnvIf Origin "^http(s)?://(.+\.)?(domain\.example|domain2\.example)$" origin_is=$0 
Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is

Saat dimasukkan .htaccess, itu pasti akan berhasil.


98
2018-06-18 06:31



Saya memiliki masalah yang sama dengan woff-font, banyak subdomain harus memiliki akses. Untuk mengizinkan subdomain, saya menambahkan sesuatu seperti ini ke httpd.conf saya:

SetEnvIf Origin "^(.*\.example\.com)$" ORIGIN_SUB_DOMAIN=$1
<FilesMatch "\.woff$">
    Header set Access-Control-Allow-Origin "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN
</FilesMatch>

Untuk beberapa domain Anda bisa mengubah regex di SetEnvIf.


84
2018-05-18 12:46



Berikut cara menggemakan kembali tajuk Asal jika cocok dengan domain Anda dengan Nginx, ini berguna jika Anda ingin melayani beberapa sub-domain font:

location /fonts {
    # this will echo back the origin header
    if ($http_origin ~ "example.org$") {
        add_header "Access-Control-Allow-Origin" $http_origin;
    }
}

55
2017-09-13 20:25



Inilah yang saya lakukan untuk aplikasi PHP yang diminta oleh AJAX

$request_headers        = apache_request_headers();
$http_origin            = $request_headers['Origin'];
$allowed_http_origins   = array(
                            "http://myDumbDomain.example"   ,
                            "http://anotherDumbDomain.example"  ,
                            "http://localhost"  ,
                          );
if (in_array($http_origin, $allowed_http_origins)){  
    @header("Access-Control-Allow-Origin: " . $http_origin);
}

Jika asal permintaan diizinkan oleh server saya, kembalikan $http_origin sendiri sebagai nilai dari Access-Control-Allow-Origin tajuk bukannya mengembalikan a * wildcard.


22
2017-12-25 21:48



Ada satu kelemahan yang harus Anda ketahui: Segera setelah Anda mengeluarkan file sumber ke CDN (atau server lain yang tidak mengizinkan scripting) atau jika file Anda di-cache pada proxy, mengubah respons berdasarkan 'Origin' tajuk permintaan tidak akan berfungsi.


18
2018-02-20 19:18