2013-01-22 12 views
37

Stworzyłem podstawową usługę RESTful ze strukturą PHP SLIM, a teraz próbuję ją podłączyć, aby uzyskać dostęp do usługi z projektu Angular.js. Czytałem, że Angular obsługuje CORS po wyjęciu z pudełka i wszystko, co musiałem zrobić, to dodać ten wiersz: Header set Access-Control-Allow-Origin "*" do mojego pliku .htaccess.włączyć cors w .htaccess

Zrobiłem to i moja aplikacja REST nadal działa (nie ma błędu wewnętrznego serwera 500 ze złego .htaccess), ale kiedy próbuję przetestować go z test-cors.org, rzuca błąd.

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

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

Mój plik .htaccess wygląda tak

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" 

Czy coś jeszcze muszę dodać do mojego .htaccess, aby to działało poprawnie, czy jest jakiś inny sposób, aby umożliwić CORS na moim serwerze ?

+0

P ossible duplikat [Jak włączyć CORS na poddomenie Wordpress?] (http: // stackoverflow.com/questions/38378729/how-to-enable-cors-a-wordpress-subdomain) –

Odpowiedz

63

Ponieważ miałem już wszystko przekazywane do index.php i tak myślałem, że spróbuję ustawić nagłówki w PHP zamiast pliku .htaccess i zadziałało! YAY! Oto co dodałem do index.php dla każdego, kto ma ten problem.

// Allow from any origin 
if (isset($_SERVER['HTTP_ORIGIN'])) { 
    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']}"); 

} 

zasługa slashingweapon na jego odpowiedź na this question

Ponieważ używam Slim Dodałem tę drogę tak, że opcje wnioski uzyskać odpowiedzi HTTP 200

// return HTTP 200 for HTTP OPTIONS requests 
$app->map('/:x+', function($x) { 
    http_response_code(200); 
})->via('OPTIONS'); 
+3

uratowałeś życie – frazras

+1

uratowałeś dwa życia do tej pory. +1 – Vignesh

+1

dziękuję, uratowałeś mi życie po przejrzeniu rozwiązania na kilka dni. – Kerisnarendra

54

should't się .htaccess użyć add zamiast set?

Header add Access-Control-Allow-Origin "*" 
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT" 
+1

Dziękujemy! to rozwiązało mój problem! Używałem 'set' i nie działało, zmieniając go za pomocą add fix it. O ile warto, zostało to zrobione na blogu wordpress, z kilkoma innymi rzeczami w pliku .htaccess oraz – BBog

+0

Ah man - Próbowałem tego z "zestawem" przez kilka dni ... ale tylko przyszedł w tym poście. Dzięki! –

+0

Dokumentacja tutaj mówi "zestaw" http://enable-cors.org/server_apache.html. Prawdopodobnie spowodowało wiele problemów! –

3

Dzięki Devinowi, znalazłem rozwiązanie dla mojej aplikacji SLIM z dostępem do wielu domen.

W 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 

w 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); 
}); 
8

To co pracował dla mnie:

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

To wygląda używasz starej wersji Slim (2.x). Możesz po prostu dodać następujące linie do .htaccess i nie musisz nic robić w skryptach 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

Jak w tej odpowiedzi Custom HTTP Header for a specific file można użyć <File> włączyć dla CORS pojedynczy plik z tym kodem:

<Files "index.php"> 
    Header set Access-Control-Allow-Origin "*" 
    Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT" 
</Files>