Nginx

位置路徑中的 Nginx 萬用字元/正則表達式

  • February 20, 2018

我的 Nginx 配置拋出 404.php如下:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
   return 404;
}

但是,我要執行的子文件夾中有一些 index.php 文件。目前配置如下:

location = /sitename/subpage/index.php {
   fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
   fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
   fastcgi_pass phpcgi; 
}

它工作得很好,但問題是重複的位置,如果有很多子頁面,那麼配置會變得很大。

我嘗試了像 * 這樣的萬用字元和一些正則表達式,它表示 nginx 測試通過但沒有載入頁面,即 404。我嘗試的是:

location = /sitename/*/index.php {
   fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
   fastcgi_pass phpcgi;
}

有什麼方法可以在該位置使用一些路徑名作為正則表達式或萬用字元?

block 中的=修飾符location是完全匹配的,沒有任何萬用字元、前綴匹配或正則表達式。這就是為什麼它不起作用。

在您的正則表達式嘗試中,匹配和[a-z]之間的單個字元。這就是為什麼它對你不起作用。a``z

您需要按如下方式設置您的位置。注意location語句的順序。nginx 選擇第一個匹配的正則表達式條件。

location ~ ^/sitename/[0-9a-z]+/index.php$ {
   fastcgi_pass phpcgi;
}

location ~ \.php$ {
   return 404;
}

我在這裡使用區分大小寫的匹配(~修飾符而不是~*)。在第一種情況下,我匹配路徑的第一部分,然後是一個或多個字母/數字字元,然後是index.php. 您可以修改匹配範圍,但請記住+“一次或多次”重複。

第二個匹配任何以 . 結尾的 URI .php。由於正則表達式的工作方式,您不需要版本中的額外字元。

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