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