nginx可以讲请求转发到其他服务上去,今天在本地调试的时候遇到个问题,记录下。
本来要将一个请求 http://hostname/api/xxx 转发到其他的服务去处理,加上下面这段代码就生效了
location /api/ {
proxy_redirect off;
proxy_pass http://192.168.1.234:12818;
}
但是调了半天他还是进入到php的处理程序去
location ~ \.php($|/)
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
不解啊,开始以为是location执行顺序的问题,查了半天没问题啊,关键这地址也不符合php文件的规则
后来想起来在使用php框架的时候,nginx配置里有个隐藏index.php的代码,这个请求就从http://hostname/api/xxx变成了http://hostname/index.php?/api/xxx,自然就跑php那处理了
if (!-e $request_filename)
{
rewrite ^/(.*)$ /index.php?/$1 last;
}
可能受php语法的影响,感觉新加的location是在rewrite前面,不应该先匹配到location吗?
查了下资料发现它们的执行顺序应该是:
- 执行server块的rewrite指令
- 执行location匹配
- 执行选定的location中的rewrite指令
所以请求先被rewrite了,所以匹配不到对应的location
最后讲rewrite移到location / {} 里,这样就能正常匹配location,之后再处理rewrite
location / {
if (!-e $request_filename)
{
rewrite ^/(.*)$ /index.php?/$1 last;
}
}
因为本地nginx之前都是用来处理php程序,所以没太在意nginx配置文件书写的格式,遇到问题了才发现到处都是细节。