Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php nginx将accept头映射到api奇怪行为的子目录_Php_Api_Http_Nginx_Hhvm - Fatal编程技术网

Php nginx将accept头映射到api奇怪行为的子目录

Php nginx将accept头映射到api奇怪行为的子目录,php,api,http,nginx,hhvm,Php,Api,Http,Nginx,Hhvm,我已经花了相当长的时间来处理这个问题,但我无法真正理解nginx+hvm是如何映射我的请求的 基本上,我在API.example.com上有一个API,我想用Accept调用它:对于版本1,application/vnd.com.example.API.v1+json;对于版本2,application/vnd.com.example.API.v2+json。API本身是一个PHP应用程序,我将使用新安装的HHVM运行它。所有请求都将由index.php处理 文件夹结构如下所示: 每当我使用RE

我已经花了相当长的时间来处理这个问题,但我无法真正理解nginx+hvm是如何映射我的请求的

基本上,我在API.example.com上有一个API,我想用Accept调用它:对于版本1,application/vnd.com.example.API.v1+json;对于版本2,application/vnd.com.example.API.v2+json。API本身是一个PHP应用程序,我将使用新安装的HHVM运行它。所有请求都将由index.php处理

文件夹结构如下所示: 每当我使用REST客户端访问带有v1 accept头的api.example.com/test时,我都会得到v1响应。当我为v2使用accept头时,它显示v2。所以一切都是正确的。如果我没有提供任何接受头,我会被重定向到example.com

NGINX配置如下所示 hhvm.conf文件包含在下面。它是hhvm附带的默认hhvm.conf的派生功能或某种精确功能

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,我会得到“fail”响应,即使我期望v1表示v1接受头,v2表示v2接受头。其他一切似乎都很正常,甚至index.html也能正确地映射到它的子目录

我试过的 我试过使用

root /var/www/api.example.com/v$api_version/; 
在配置中,但这只给了我来自NGINX的404个错误。我相信我正在寻找的实际上是改变根路径,但我还没有弄清楚如何让它工作。我还尝试删除nginx配置和hhvm.conf中的索引参数,但这似乎没有帮助。我还尝试了大量不同的配置,我已经打开了至少20-30个stackoverflow选项卡来解决这个问题,但我显然缺少了一些东西(可能相当简单)。我还尝试将hhvm包含移动到位置块中

设置 Debian 7, nginx/1.2.1, hhvm 3.2.0


哦,这是我第一次在这里问问题希望我的格式都正确。

hhvm.conf的内容是什么

我假设FastCGI被用来代理对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 location指令相匹配,这很好,但在这样做时,您的try_files设置(似乎负责进行API版本到文件系统的映射)没有得到处理

没有hhvm.conf,很难说下一步该做什么,但我怀疑您需要关注包含hhvm fastcgi设置的location指令中的根值

更新

因此,我有一个API版本的概念,它是从头映射到一个在nginx+hvm上为我工作的文件系统派生出来的。以下是我的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提供静态文件等。但这对我有用-结合你在原始帖子中的
地图
,当我
curl-H'Accept:application/vnd.com.example.api.v2+json'localhost
时,我从版本目录中的
index.php
文件获得了预期的响应


我认为您需要做的是使用动态生成的
root
声明更新HHVM nginx配置,就像上面我的声明一样。如果您仍然获得404,请尝试以下操作:在
/etc/init.d/hhvm
中,找到
附加参数=
变量,使其成为
附加参数=“-vServer.FixPathInfo=true”
。我不确定它到底是做什么的,但我以前遇到过它,它修复了我过去遇到的一个奇怪的404问题(404来自HHVM,而不是Apache/nginx)。

+1个好问题。为什么不能让所有新用户都像你一样?@RaduMurzea非常感谢:)很高兴听到这个消息。遗憾的是,我没有你的问题的答案,但我会确保进一步调查。我使用默认的HHVM配置以避免混淆(我让它做这部分,但实际上我不确定它是如何工作的)。我将用HHVM配置文件更新这个问题。我一直在以与您相同的方式进行推理,但根据我的问题,您可以注意到使用
root/var/www/api.example.com/v$api_version/只给了我404个错误。你的回答帮助很大。这是朝着正确方向迈出的一步。实际上,hhvm.conf包含.hh和.php文件结尾的映射,这将使其优先于try_文件,而不是太奇怪。但是,由于404错误,我仍然无法将根目录更改为子目录。但也许我可以通过包含hhvm.conf来解决这个问题,它不包含.hh和.php的映射。
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;
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;
}