Apache-2.2

使用 Nginx 的 Apache 風格的多視圖

  • December 3, 2019

對於我正在執行的一些非 CMS 站點,我有興趣從 Apache/mod_php 切換到 Nginx。有問題的站點要麼是完全靜態的 HTML 文件,要麼是簡單的 PHP,但它們的共同點是我目前正在使用 Apache 的 mod_negotiation 來為它們提供服務,而無需文件副檔名。我不關心實際的內容協商;我使用它只是為了不必在我的 URL 中使用文件副檔名。

例如,文件 at/info/contact.php是通過一個 URL 訪問的/info/contact

實際文件是.php該位置的文件,但我不使用 URL 中的副檔名。這給了我更短、更清晰的 URL,也不會向使用者公開本質上無意義的實現細節。在 Apache 中,所有這些都需要啟用 mod_negotiation 並將 +MultiViews 添加到站點的選項中。在 Nginx 中,我想我會以某種方式重寫,但對 Nginx 來說是新手,我不確定該怎麼做。

這些站點目前從 Nginx 代理到 Apache 執行良好,但我想嘗試僅使用 Nginx/fastcgi 執行它們。只要我使用擴展,它們就可以正常工作,所以 fastcgi 方面工作得很好。我現在關心的只是刪除這些擴展。

重要的是要記住,在子目錄的情況下,文件名並不總是在 URL 中。那是,

/foo/bar應該尋找/foo/bar.php/foo/bar/index.php

/foo/應該尋找/foo/index.php

有沒有一種簡單的方法可以用 Nginx 實現這一點,還是我應該堅持代理到 Apache?

你不需要任何繁瑣的重寫,try_files非常適合這個。基本上只有一行。

server {
   server_name foo.com;
   root /your/root/path;
   index index.php;

   location /
       try_files $uri.php $uri/ /notfound.html;
   }

   # Your standard PHP location and everything else is still required here.
}

或者,您可以使用:

try_files $uri $uri/ index.php;

如果沒有/在 index.php 前面,它會尋找/foo/bar/index.php如果找不到/foo/bar/somethingelse.php. (大多數人都有/index.php作為備份,因為這通常適用於 wordpress 和類似的 CMS)。

引用自:https://serverfault.com/questions/211515