aktifkan cors di .htaccess
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
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');
Bukankah sebaiknya .htaccessdigunakan addsebagai gantinya set?
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
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"
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>
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]
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]
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);
});
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