nginx map接受header到api的子目录奇怪的行为

这段时间我已经摆弄了很长一段时间了,而且我也无法真正掌握nginx + hhvm如何映射我的请求。

Basiclly,我在api.example.com上有一个API,我想用Accept:application / vnd.com.example.api.v1 + json for version 1和application / vnd.com.example.api.v2 +版本2的json。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的回应。 当我使用v2的accept头时,它显示v2。 所以一切都是正确的。 如果我不提供任何接受标题,我会redirect到example.com

NGINXconfiguration看起来像这样

 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包含的默认hhvm.conf的派生或某些确切的function。

 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 accept header,v2为v2 accept header。 一切似乎工作正常,甚至index.html正确映射到它的子目录。

我试过了

我试过使用

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

在configuration中,但只能给我从NGINX 404错误。 我相信我正在寻找的东西实际上正在改变根本的道路,但我还没有弄清楚如何使其工作。 我也尝试在nginxconfiguration和hhvm.conf中删除索引参数,但这似乎没有帮助。 我也尝试了很多不同的configuration,并且我已经打开了至less20-30个stackoverflow标签来解决这个问题,但是我显然在这里错过了一些东西(可能很简单)。 我也尝试移动位置块内的hhvm包含。

设置

Debian 7,nginx / 1.2.1,hhvm 3.2.0

哦,这是我第一次在这里问一个问题。 :)希望我已经正确地格式化了一切。

什么是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,很难说下一步该做什么,但是我怀疑你需要关注包含HHVM fastcgi设置的location指令中的根值。

UPDATE

所以我有一个从头文件映射到nginx + HHVM上为我工作的文件系统派生的API版本的概念。 这是我的HHVM的nginx配置:

 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 post,当我curl -H 'Accept: application/vnd.com.example.api.v2+json' localhost ,我从版本的目录中的index.php文件得到预期的响应。

我认为你需要做的是更新你的HHVM的nginx配置与动态生成的root声明像我的上面。 如果你仍然得到一个404,试试这个:在/etc/init.d/hhvm ,找到ADDITIONAL_ARGS= var,使其ADDITIONAL_ARGS="-vserver.FixPathInfo=true" 。 我不确定它究竟做了什么,但是我之前遇到过,它修复了我以前遇到的一个奇怪的404问题(404是来自HHVM,而不是Apache / nginx)。