1. 背景及前因
- 背景
開發環境: php:7.2.1;nginx:1.11.5;後端框架:laravel 5.1; - 前因
開發中的後臺,有些頁面使用了通過 url 實現的分頁功能;然而分頁功能通過 url 沒有正確實現;
2. 問題排查
追因
對 laravel 框架中的
Resquest
類進行追查,其 capture() 方法引用基類SymfonyRequest
中的 createFromGlobals() 方法,並發現 request 參數第一次獲取位置爲SymfonyRequest
類中 createFromGlobals() 方法
相關代碼:$request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $server);
其中 $_GET 的值已經不正常。注:SymfonyRequest 類的文件位置:vendor\symfony\http-foundation\Request.php
、測試
在相關控制器中的測試發現,當以 get 方式的請求參數數量爲 1 個時,參數值不正常;當 get 請求參數數量大於 1 時,參數獲取正常。示例如下:
// get 參數數量爲 1 個時 // url 如果爲: http://localhost.cn/xxx/?id=2 var_dump($_GET); // 其輸出爲: array('id' => '2id=2') // get 參數數量大於 1 個時 // url 如果爲: http://localhost.cn/xxx/?id=2&a=2 var_dump($_GET); // 其輸出爲: array('id' => 2, 'a' => 2)
繼續追因
因爲 laravel 框架要求,需要對 nginx 做 try_files 操作。所以檢查 nginx 配置文件,發現配置內容爲
location / { try_files $uri $uri/ /index.php$is_args$args$query_string; }
根據對 nginx 參數檢查發現
$args
與$query_string
的值是一樣的。
就此,問題原因查明;
改正爲location / { try_files $uri $uri/ /index.php$is_args$query_string; }
問題解決;
3. 反思及總結
- 對 laravel 框架的配置文件瞭解不夠充分。
- 在對問題追查時,應該對框架核心功能表現出相對的信任。
- 問題出現時,應該首先對參數輸入源進行檢查,如:直接檢查 $_GET 的值,這樣會節省不少時間。
- 通過此次問題,加深了對 laravel Resquest 類的實現過程。
- 加深了 nginx 內置預定義變量的相關知識。