首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

CodeIgniter 完美解決 URL 中文參數亂碼與 400 錯誤

     編輯:PHP 綜合知識

問題根源

CodeIgniter 默認配置僅允許 URL 包含 ASCII 字符。當 URL 出現中文等非 ASCII 字符時,CI 會直接拋出 The URI you submitted has disallowed characters. 錯誤。許多開發者嘗試用 urlencode() 處理,但 Web Server(Apache/IIS)會自動解碼並按自身編碼(IIS 為 GBK,Apache 為 UTF-8)傳遞給 PHP,導致手動編碼無效。

核心解決方案:擴展 CI_URI 類

利用 CodeIgniter 的核心類擴展機制,不修改框架核心文件。在 application/core/ 目錄(CI 2.0 以前為 application/libraries/)創建 MY_URI.php:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class MY_URI extends CI_URI {
    /**
     * 重寫 URI 過濾方法,支持中文字符
     */
    protected function _filter_uri($str) {
        if ($str !== '' AND $this->config->item('permitted_uri_chars') !== '') {
            // 先編碼再匹配,允許中文通過正則檢查
            $str = urlencode($str);
            if (!preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str)) {
                exit('The URI you submitted has disallowed characters.');
            }
            // 解碼還原為原始字符供後續路由使用
            $str = urldecode($str);
        }
        return $str;
    }
}

配置許可字符集

修改 application/config/config.php 中的 permitted_uri_chars,添加 + 號(urlencode 將空格轉為 +)及中文 Unicode 範圍:

// 原配置
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';

// 修改方案一:添加 + 號
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\+\-';

// 修改方案二:直接允許中文 Unicode 範圍(推薦)
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-\u4e00-\u9fa5';

注意: 正則中的 \u4e00-\u9fa5 需在 PHP 字符串中正確轉義,實際配置建議使用原生字符或十六進制表示。

解決 IIS 環境下的中文亂碼

在 IIS 上運行時,$_SERVER['REQUEST_URI'] 獲取的中文可能為 GB2312 編碼,需手動轉換:

$uri = $_SERVER['REQUEST_URI'];
$uri = iconv('GB2312', 'UTF-8', $uri); // 轉為項目統一的 UTF-8 編碼

此問題源於 IIS 默認使用 GBK 編碼處理 URL,而 Apache 使用 UTF-8。建議統一服務器環境或在入口文件統一處理編碼轉換。

完整驗證流程

  1. 創建 MY_URI.php 並放入正確目錄。
  2. 修改 config.php 許可字符集。
  3. (可選)在 index.php 入口處添加編碼統一代碼。
  4. 測試訪問 https://example.com/控制器/方法/中文參數。

避坑指南

  • 不要直接修改 system/core/URI.php,升級框架時會丟失修改。
  • 若使用 Nginx + PHP-FPM,確保 fastcgi_param REQUEST_URI 傳遞正確。
  • 路由規則 $route 中正則需匹配解碼後的字符。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved