nginx location反向代理問題

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嗎?

查了下資料發現它們的執行順序應該是:

  1. 執行server塊的rewrite指令
  2. 執行location匹配
  3. 執行選定的location中的rewrite指令

所以請求先被rewrite了,所以匹配不到對應的location

最後講rewrite移到location / {} 裏,這樣就能正常匹配location,之後再處理rewrite

location / {

    if (!-e $request_filename)
    {
          rewrite ^/(.*)$ /index.php?/$1 last;
    }

}

因爲本地nginx之前都是用來處理php程序,所以沒太在意nginx配置文件書寫的格式,遇到問題了才發現到處都是細節。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章