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配置文件書寫的格式,遇到問題了才發現到處都是細節。