Карта nginx принимает заголовок в подкаталог для странного поведения API

Я довольно долго возился с этим и не могу понять, как nginx + hhvm отображает мои запросы.

В основном у меня есть API на api.example.com, который я хотел бы вызвать с помощью Accept: application / vnd.com.example.api.v1 + json для версии 1 и application / vnd.com.example.api.v2 + json для версии 2. Сам API — это PHP-приложение, которое я буду запускать с использованием новой установки HHVM. Все запросы будут обработаны index.php.

api.example.com/
index.php (content: fail)
v1/
index.php (content: v1)
v2/
index.php (content: v2)

Всякий раз, когда я использую свой REST-клиент для доступа к api.example.com/test с заголовком принятия v1, я получаю ответ v1. Когда я использую заголовок accept для v2, он показывает v2. Так что все правильно. Если я не предоставлю заголовок accept, я буду перенаправлен на example.com

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;
}
}

файл hhvm.conf включен ниже. Это производная или несколько точная функциональность hhvm.conf по умолчанию, включенная в 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;
}

Если я пытаюсь получить доступ к api.example.com/index.php, я получаю ответ «ошибка», даже если я ожидаю v1 для заголовка принятия v1 и v2 для заголовка принятия v2. Все остальное работает нормально, даже index.html корректно отображается в его подкаталоге.

Я пытался использовать

root /var/www/api.example.com/v$api_version/;

в конфигурации, но это только дает мне 404 ошибки от NGINX. Я верю, что на самом деле я ищу изменение корневого пути, но я не могу понять, как заставить его работать. Я также попытался удалить параметры индекса как в конфигурации nginx, так и в hhvm.conf, но это, похоже, не помогает. Я также пробовал множество различных конфигураций, и у меня было открыто по крайней мере 20-30 вкладок stackoverflow, но я явно что-то упускаю (возможно, довольно просто) здесь. Я также попытался переместить hhvm include внутри блока местоположения.

Debian 7,
Nginx / 1.2.1,
ххвм 3.2.0

О, и я впервые задаю вопрос здесь. 🙂 надеюсь, я все правильно отформатировал.

9

Решение

Каково содержание hhvm.conf?

Я предполагаю, что Fast CGI используется для прокси-запросов к серверу HHVM. Так что ваш hhvm.conf может выглядеть примерно так:

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;

Который должен быть обернут директивой местоположения.

Итак, на основании вашей конфигурации показано, что я думаю, что вы должны сопоставлять php-скрипты с директивой определения местоположения HHVM, что хорошо, но при этом ваш параметр try_files, который, кажется, отвечает за выполнение версии API для файла отображение системы, не обрабатывается.

Без вашего hhvm.conf трудно сказать, что делать дальше, но я подозреваю, что вам нужно сосредоточиться на корневом значении внутри директивы location, которая содержит настройки HHVM fastcgi.

ОБНОВИТЬ

Итак, у меня есть концепция версии API, полученной из сопоставления заголовков с файловой системой, работающей для меня на nginx + HHVM. Вот мой конфиг nginx для 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;
}

На самом деле, хотя расположение / не лучше вашего — на самом деле ваш, вероятно, лучше, так как вы, вероятно, не хотите, чтобы HHVM обслуживал статические файлы и т. д. Но это работает для меня — в сочетании с map у вас в исходном посте, когда я curl -H 'Accept: application/vnd.com.example.api.v2+json' localhostЯ получаю ожидаемый ответ от index.php файл внутри каталога версии.

Я думаю, что вам нужно обновить конфигурацию HHVM nginx динамически сгенерированным root декларация как у меня выше. Если вы все еще получаете 404, попробуйте это: в /etc/init.d/hhvm, Найти ADDITIONAL_ARGS= вар, сделай это ADDITIONAL_ARGS="-vServer.FixPathInfo=true", Я не уверен точно, что он делает, но я сталкивался с этим раньше, и это устранило странную проблему 404, с которой я сталкивался в прошлом (когда 404 исходил от HHVM, а не от Apache / nginx).

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]