[ Nginx ] 記錄關於 $_GET 獲取參數有誤的一次問題排查

1. 背景及前因

  1. 背景
    開發環境: php:7.2.1;nginx:1.11.5;後端框架:laravel 5.1;
  2. 前因
    開發中的後臺,有些頁面使用了通過 url 實現的分頁功能;然而分頁功能通過 url 沒有正確實現;

2. 問題排查

  1. 追因

    對 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

  2. 測試

    在相關控制器中的測試發現,當以 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)
  3. 繼續追因

    因爲 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. 反思及總結

  1. 對 laravel 框架的配置文件瞭解不夠充分。
  2. 在對問題追查時,應該對框架核心功能表現出相對的信任。
  3. 問題出現時,應該首先對參數輸入源進行檢查,如:直接檢查 $_GET 的值,這樣會節省不少時間。
  4. 通過此次問題,加深了對 laravel Resquest 類的實現過程。
  5. 加深了 nginx 內置預定義變量的相關知識。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章