origin habilitar control chrome allow php http-headers cors silex

php - habilitar - Solicitud de verificación previa de CORS que devuelve HTTP 405



cors php (2)

Intento crear un servicio web RESTful y me he atascado en la implementación de solicitudes PUT. He intentado y no he podido seguir otras respuestas en este sitio y varios artículos de Mozilla.

La solicitud se genera desde el dominio wwwtest.dev-box y va a test.dev-box (básicamente una aplicación de front-end que llama a la aplicación de back-end). Aquí están los encabezados que he capturado de los encabezados de HTTP vivo:

http://test.dev-box/resource/v1/data/user/1 OPTIONS /resource/v1/data/user/1 HTTP/1.1 Host: test.dev-box User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Origin: http://wwwtest.dev-box Access-Control-Request-Method: PUT Connection: keep-alive HTTP/1.1 405 Method Not Allowed Date: Wed, 16 Oct 2013 16:15:58 GMT Server: Apache/2.2.15 (Red Hat) x-powered-by: PHP/5.3.27 Access-Control-Allow-Origin: http://wwwtest.dev-box Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS Access-Control-Max-Age: 1728000 Content-Length: 0 Allow: PUT Cache-Control: no-cache Connection: close Content-Type: text/html; charset=UTF-8

Estoy usando un framework para que todo se enrute a web.php, que contiene el siguiente código en la parte superior de la página (tomado de este artículo de MDN ):

if ($_SERVER[''REQUEST_METHOD''] == ''OPTIONS'') { header(''Access-Control-Allow-Origin: http://wwwtest.dev-box''); header(''Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS''); header(''Access-Control-Max-Age: 1728000''); header("Content-Length: 0"); header("Content-Type: text/plain"); } else { header("HTTP/1.1 403 Access Forbidden"); header("Content-Type: text/plain"); }

Antes de que mi código haga la solicitud PUT, primero envía la solicitud CORS preflight OPTIONS (como puede ver en la captura anterior). Los encabezados necesarios se deben adjuntar a la respuesta y decirle al solicitante que PUT está permitido. Desafortunadamente, como puede ver en los encabezados de respuesta anteriores, todavía se está devolviendo el método 405 no permitido, aunque PUT está en la respuesta access-control-allow-methods.

Este es el archivo .htaccess para el framework que estoy usando (Silex):

<IfModule mod_rewrite.c> Options -MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ web.php [QSA,L] </IfModule>


El 405 está en referencia a la solicitud real de verificación / OPCIONES. Su servidor está rechazando la verificación previa ya que las solicitudes OPTIONS en general no son aceptadas por su servidor. Tendrá que modificar la configuración de su servidor para aceptar solicitudes OPTIONS. Simplemente incluir código en un archivo PHP puede no ser suficiente. Lo más probable es que su servidor de aplicaciones / web no tenga conocimiento de este verbo y rechace la solicitud antes de que llegue a su código PHP.


He encontrado que la respuesta es un cruce entre Apache y la configuración del framework.

  1. Para la configuración de Apache, puede poner lo siguiente en su directiva VirtualHost, o en el archivo .htaccess del dominio solicitado (si está en .htaccess, recuerde encapsular con las etiquetas ifModule mod_headers.c). Establecer los encabezados en la página a la que redirige mod_rewrite no funciona:

    Conjunto de encabezado Access-Control-Allow-Origin " http: //wwwtest.dev-box "

    Conjunto de encabezado Access-Control-Allow-Methods "GET, POST, HEAD, DELETE, PUT, OPTIONS"

  2. Para la configuración de Silex, coloque lo siguiente en sus rutas de aplicación. Básicamente, envía un HTTP 200 OK para cualquier solicitud OPTIONS que reciba. Código encontrado en el Silex Google Group :

    $ app-> match ("{url}", función ($ url) use ($ app) {return "OK";}) -> assert (''url'', ''. *'') -> method ("OPTIONS" );

Ambos pasos deben completarse para que la aplicación RESTful funcione correctamente.