前言
在使用 Nginx 及 PHP-FPM 組合時,使用 try_file
或 rewrite
指令,相同的請求在 PHP 的 $_GET
變數內容會有所不同。這個是因為 Nginx 在 rewrite
及 try_files
對 $query_string
的處理方式不同所導致。
Nginx 的內建變數 $uri、$is_args、$query_string
當 Nginx 收到一個請求 /example/?key=wp
,那麼 $uri
、$is_args
、$query_string
變數內容分別是:
$uri: /example/
$is_args: ?
$query_string: key=wp
使用 rewrite
在 rewrite
的使用中,Nginx 會將保留 $query_string
的內容。所以使用下面的方式,可以把 $uri
跟 $query_string
內容傳送給 index.php
。
location / {
rewrite ^(.*)$ /index.php$1 last; # 在這個範例中,$uri 跟 $1 的內容相同
}
使用 try_files
在 try_files
的使用中,Nginx 將會捨棄 $query_string
的內容。所以需要自行加上 $is_args$query_string
,才能把 $query_string
的內容傳送給 index.php
。
location / {
try_files $uri $uri/ /index.php$uri$is_args$query_string;
}
使用 PHP Framewrok 的情境
如果使用 PHP Framework 開發,需要根據每一套的 Framework 的實作方式做調整。例如使用 $_SERVER['request_uri']
進行路由的 Laravel
,又或者使用 $_SERVER['path_info']
進行路由的 ThinkPHP
,所需要的配置方式都不相同。
結論
對於不同做法的 PHP 程式碼,需要根據實現情況,調整 Nginx 配置。