php - nginx mapa aceptar encabezado al subdirectorio para api comportamiento extraño
http hhvm (1)
¿Cuáles son los contenidos de hhvm.conf?
Supongo que Fast CGI se está utilizando para enviar solicitudes al servidor HHVM. Entonces su hhvm.conf podría verse más o menos así:
root /var/www/api.example.com;
index index.php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
Que debería ser envuelto por una directiva de ubicación.
Por lo tanto, según lo que se muestra en tu configuración, creo que debes estar asociando scripts de PHP a la directiva de ubicación de HHVM, lo cual está bien, pero al hacerlo, tu configuración try_files, que parece ser la encargada de hacer la versión de la API al archivo mapeo del sistema, no se está procesando.
Sin su hhvm.conf es difícil decir qué hacer a continuación, pero sospecho que debe centrarse en el valor de raíz dentro de la directiva de ubicación que contiene la configuración rápida de HHVM.
ACTUALIZAR
Así que tengo el concepto de una versión API derivada de la asignación de encabezados a un sistema de archivos que funciona para mí en nginx + HHVM. Aquí está mi configuración de nginx para HHVM:
location / {
root /var/www/html/hh/v$api_version;
index index.php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Realmente, la ubicación de /
no es mejor que la tuya, de hecho, la tuya probablemente sea mejor, ya que probablemente no quieras que HHVM sirva archivos estáticos, etc. Pero esto funciona para mí, combinado con el map
que tienes en tu original post, cuando curl -H ''Accept: application/vnd.com.example.api.v2+json'' localhost
, obtengo la respuesta esperada de un archivo index.php
dentro del directorio de la versión.
Creo que lo que debes hacer es actualizar tu HHVM nginx config con una declaración de root
generada dinámicamente como la anterior. Si todavía obtiene un 404, intente esto: en /etc/init.d/hhvm
, busque ADDITIONAL_ARGS=
var, ADDITIONAL_ARGS="-vServer.FixPathInfo=true"
. No estoy seguro de qué es exactamente, pero lo he encontrado antes y había solucionado un extraño problema 404 que estaba teniendo en el pasado (donde el 404 venía de HHVM, no de Apache / nginx).
He estado jugando con esto durante bastante tiempo, y realmente no puedo entender cómo nginx + hhvm asigna mis solicitudes.
Básicamente, tengo una API en api.example.com a la que me gustaría llamar con el botón Aceptar: application / vnd.com.example.api.v1 + json para la versión 1 y application / vnd.com.example.api.v2 + json para la versión 2. La API en sí es una aplicación PHP que ejecutaré utilizando una nueva instalación de HHVM. Todas las solicitudes serán manejadas por index.php.
La estructura de la carpeta se ve así:
api.example.com/
index.php (content: fail)
v1/
index.php (content: v1)
v2/
index.php (content: v2)
Cada vez que uso mi cliente REST para acceder a api.example.com/test con el encabezado v1 accept, obtengo la respuesta v1. Cuando uso el encabezado accept para v2, muestra el v2. Entonces todo está correcto. Si no proporciono ningún encabezado de aceptación, me redirigen a example.com
La configuración NGINX se ve así
map $http_accept $api_version {
default 0;
"application/vnd.com.example.api.v1+json" 1;
"application/vnd.com.example.api.v2+json" 2;
}
server {
# listen to :80 is already implied.
# root directory
root /var/www/api.example.com/;
index index.html;
server_name api.example.com;
include hhvm.conf;
location / {
if ($api_version = 0) {
# redirect to example.com if applicable
# Accept-header is missing
return 307 http://example.com;
}
try_files /v$api_version/$uri /v$api_version/$uri/ /v$api_version/index.php?$args;
}
# Prevent access to hidden files
location ~ //. {
deny all;
}
}
el archivo hhvm.conf se incluye a continuación. Es una funcionalidad derivada o algo exacta del hhvm.conf predeterminado incluido con hhvm.
location ~ /.(hh|php)$ {
fastcgi_keep_conn on;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Este es mi problema
Si intento acceder a api.example.com/index.php aparece la respuesta "fail", incluso si estoy esperando que v1 acepte el encabezado v1 y v2 para el encabezado v2 accept. Todo lo demás parece funcionar bien, incluso index.html se asigna correctamente a su subdirectorio.
Lo que he intentado
He intentado usar
root /var/www/api.example.com/v$api_version/;
en la configuración, pero eso solo me da errores 404 de NGINX. Creo que lo que estoy buscando en realidad es cambiar el camino de la raíz, pero no entiendo cómo hacerlo funcionar. También intenté eliminar los parámetros de índice tanto en la configuración de nginx como en hhvm.conf, pero eso no parece ser de ayuda. También probé una tonelada de configuraciones diferentes y tuve al menos 20-30 pestañas de stackoverflow abiertas para resolver esto, pero claramente me falta algo (probablemente bastante simple) aquí. También intenté mover el hhvm include dentro del bloque de ubicación.
La puesta en marcha
Debian 7, nginx / 1.2.1, hhvm 3.2.0
Ah, y es la primera vez que hago una pregunta aquí. :) Espero haber formateado todo correctamente.