aktifkan cors di .htaccess

Jan 23 2013

Saya telah membuat layanan RESTful dasar dengan kerangka kerja SLIM PHP dan sekarang saya mencoba untuk menghubungkannya sehingga saya dapat mengakses layanan dari proyek Angular.js. Saya telah membaca bahwa Angular mendukung CORS di luar kotak dan yang perlu saya lakukan hanyalah menambahkan baris ini: Header set Access-Control-Allow-Origin "*"ke file .htaccess saya.

Saya telah melakukan ini dan aplikasi REST saya masih berfungsi (tidak ada kesalahan server internal 500 dari .htaccess yang buruk) tetapi ketika saya mencoba mengujinya dari test-cors.org itu membuat kesalahan.

Fired XHR event: loadstart
Fired XHR event: readystatechange
Fired XHR event: error

XHR status: 0
XHR status text: 
Fired XHR event: loadend

File .htaccess saya terlihat seperti ini

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /index.php [QSA,L]
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"

Apakah ada hal lain yang perlu saya tambahkan ke .htaccess saya agar ini berfungsi dengan benar atau adakah cara lain untuk mengaktifkan CORS di server saya?

Jawaban

94 DevinCrossman Jan 23 2013 at 05:44

Karena saya memiliki segalanya yang diteruskan ke index.php, saya pikir saya akan mencoba mengatur header di PHP daripada file .htaccess dan itu berhasil! YAY! Inilah yang saya tambahkan ke index.php untuk orang lain yang mengalami masalah ini.

// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) { // should do a check here to match $_SERVER['HTTP_ORIGIN'] to a
    // whitelist of safe domains
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Max-Age: 86400'); // cache for 1 day } // Access-Control headers are received during OPTIONS requests if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS"); if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

}

Kredit diberikan kepada slashingweapon untuk jawabannya atas pertanyaan ini

Karena saya menggunakan Slim, saya menambahkan rute ini sehingga permintaan OPTIONS mendapatkan respons HTTP 200

// return HTTP 200 for HTTP OPTIONS requests
$app->map('/:x+', function($x) {
    http_response_code(200);
})->via('OPTIONS');
82 markmarijnissen Dec 30 2013 at 18:20

Bukankah sebaiknya .htaccessdigunakan addsebagai gantinya set?

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
23 JackLeon Feb 06 2016 at 12:43

Inilah yang berhasil untuk saya:

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"
11 jcubic Mar 18 2017 at 18:32

Seperti dalam jawaban ini, Header HTTP Khusus untuk file tertentu yang dapat Anda gunakan <File>untuk mengaktifkan CORS untuk satu file dengan kode ini:

<Files "index.php">
  Header set Access-Control-Allow-Origin "*"
  Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
</Files>
9 levin Nov 27 2018 at 08:16

Akan berfungsi 100%, Terapkan di .htaccess:

# Enable cross domain access control
SetEnvIf Origin "^http(s)?://(.+\.)?(1xyz\.com|2xyz\.com)$" REQUEST_ORIGIN=$0
Header always set Access-Control-Allow-Origin %{REQUEST_ORIGIN}e env=REQUEST_ORIGIN
Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
Header always set Access-Control-Allow-Headers "x-test-header, Origin, X-Requested-With, Content-Type, Accept"

# Force to request 200 for options
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule .* / [R=200,L]
8 SantanuBrahma Mar 01 2016 at 01:35

Sepertinya Anda menggunakan slim (2.x) versi lama. Anda cukup menambahkan baris berikut ke .htaccess dan tidak perlu melakukan apa pun dalam skrip PHP.

# Enable cross domain access control
SetEnvIf Origin "^http(s)?://(.+\.)?(domain_one\.com|domain_two\.net)$" REQUEST_ORIGIN=$0
Header always set Access-Control-Allow-Origin %{REQUEST_ORIGIN}e env=REQUEST_ORIGIN
Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE"
Header always set Access-Control-Allow-Headers: Authorization

# Force to request 200 for options
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule .* / [R=200,L]
2 KarlAdler Oct 27 2014 at 21:26

Berkat Devin, saya menemukan solusi untuk aplikasi SLIM saya dengan akses multi domain.

Di htaccess:

SetEnvIf Origin "http(s)?://(www\.)?(allowed.domain.one|allowed.domain.two)$" AccessControlAllowOrigin=$0$1
Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header set Access-Control-Allow-Credentials true

di index.php

// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS"); if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); } // instead of mapping: $app->options('/(:x+)', function() use ($app) { //...return correct headers... $app->response->setStatus(200);
});
1 RocíoGarcíaLuque Jan 13 2017 at 03:42

Saya mencoba solusi @abimelex, tetapi di Slim 3.0, memetakan permintaan OPTIONS berjalan seperti:

$app = new \Slim\App(); $app->options('/books/{id}', function ($request, $response, $args) {
    // Return response headers
});

https://www.slimframework.com/docs/objects/router.html#options-route