laravel gère l'OPTION requête de méthode http

je développe une application angularjs qui utilise laravel comme serveur de back end. J'ai du mal à accéder aux données de laravel car avant chaque requête GET, angular envoie d'abord une requête D'OPTION comme ci-dessous

OPTIONS /61028/index.php/api/categories HTTP/1.1
Host: localhost
Connection: keep-alive
Cache-Control: max-age=0
Access-Control-Request-Method: GET
Origin: http://localhost:3501
Access-Control-Request-Headers: origin, x-requested-with, accept
Accept: */*
Referer: http://localhost:3501/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: UTF-8,*;q=0.5

j'ai essayé de répondre en ajoutant le code suivant à l'avant du filtre

    if (Request::getMethod() == "OPTIONS") {
     $headers = array(
       'Access-Control-Allow-Origin' =>' *',
       'Access-Control-Allow-Methods'=>' POST, GET, OPTIONS, PUT, DELETE',
       'Access-Control-Allow-Headers'=>'X-Requested-With, content-type',);
      return Response::make('', 200, $headers);
    }

Cela crée une réponse avec les en-têtes

Content-Encoding: gzip
X-Powered-By: PHP/5.3.5-1ubuntu7.11
Connection: Keep-Alive
Content-Length: 20
Keep-Alive: timeout=15, max=97
Server: Apache/2.2.17 (Ubuntu)
Vary: Accept-Encoding
access-control-allow-methods: POST, GET, OPTIONS, PUT, DELETE
Content-Type: text/html; charset=UTF-8
access-control-allow-origin: *
cache-control: no-cache
access-control-allow-headers: X-Requested-With, content-type

bien que les en-têtes soient définis, le navigateur affiche toujours une erreur

XMLHttpRequest cannot load http://localhost/61028/index.php/api/categories. Origin http://localhost:3501 is not allowed by Access-Control-Allow-Origin.

j'ai également essayé le réglage de l'autoriser l'origine à l'origine présentée dans l'en-tête de demande ci-dessous

    $origin=Request::header('origin');
    //then within the headers
    'Access-Control-Allow-Origin' =>' '.$origin[0],

et toujours la même erreur Ce que je fais mal? Toute aide est grandement appréciée.

Edit 1

j'utilise actuellement un hack très moche où je survole l'initialisation de laravels lorsqu'une requête D'OPTIONS est reçue. Ce que j'ai fait dans l'index.php

<?php
if ($_SERVER['REQUEST_METHOD']=='OPTIONS') {
header('Access-Control-Allow-Origin : *');
header('Access-Control-Allow-Methods : POST, GET, OPTIONS, PUT, DELETE');
header('Access-Control-Allow-Headers : X-Requested-With, content-type');
}else{
/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package  Laravel
 * @version  3.2.13
 * @author   Taylor Otwell <taylorotwell@gmail.com>
 * @link     http://laravel.com
 */

j'ai aussi dû ajouter le permettre-en-tête d'origine à l'avant de filtrer.

je sais que ce n'est pas intelligent, mais c'est ma seule solution pour l'instant

19
demandé sur Marco Rivadeneyra 2013-01-19 17:34:33

3 réponses

Ceci est en référence à votre question concernant la question ci-dessus. Vous n'avez pas mentionné la version de laravel et angularJS. Je suppose que vous utilisez lattest angularJS et Laravel. J'ai aussi supposer, l'angle est hébergé sur http://localhost:3501 et le laravel est hébergé sur http://localhost Il suffit de suivre les étapes ci-dessous.

  • mettre en dessous du bloc de code dans /public/.fichier htaccess de laravel

    Header set Access-Control-Allow-Origin "http://localhost:3501"
    Header set Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS"
    Header set Access-Control-Allow-Credentials "true"
    
  • Mettre en dessous de la ligne dans la configuration angulaire

    $httpProvider.defaults.withCredentials = true;
    

ne Jamais utiliser * comme caractère de Joker. Larvel ne peut pas identifier le domaine pour la gestion de session. Donc, mettre http://localhost:3501 comme nom de domaine complet à Access-Control-Allow-Origin. Je pense que ces va vous aider.

3
répondu Koushik Samanta 2014-09-23 06:08:09

C'est un bug à Laravel qui a obtenu récemment fixe. Vous pouvez vouloir mettre à jour à la dernière révision.

de plus, vous devez activer le support CORS pour votre serveur.

0
répondu NARKOZ 2014-07-14 20:22:26

ajouter ceci dans votre index.fichier php

header('Access-Control-Allow-Origin: *'); 
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
-2
répondu james kandau 2016-09-19 12:05:44