前言
在使用 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 配置。