使用 Nginx 及 PHP-FPM 時,PHP 中的 $_GET 有概率出現空值

前言

在使用 Nginx 及 PHP-FPM 組合時,使用 try_filerewrite 指令,相同的請求在 PHP 的 $_GET 變數內容會有所不同。這個是因為 Nginx 在 rewritetry_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 配置。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端