使用 Nginx 的 Apache 風格的多視圖
對於我正在執行的一些非 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)。