CodeIgniter 預設禁止 URL 出現非 ASCII 字符,直接拋錯。手動 urlencode() 無效,因 Web Server 會自動解碼後再傳給 PHP。本文提供「擴展核心類」而非修改核心的優雅方案,並解決空格轉 + 被攔截的問題。
application/core/MY_URI.php 覆寫 _filter_uri<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
class MY_URI extends CI_URI {
protected function _filter_uri($str) {
if ($str !== '' && $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;
}
}
config.php 允許字符集$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\+\-'; // 新增 + 號
或直接支援中文 Unicode 範圍(實測有效):
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_-u4e00-u9fa5';
若 $_SERVER['REQUEST_URI'] 取得的中文為亂碼(IIS 常見),需手動轉碼:
$uri = iconv("gb2312", "UTF-8", $uri);
根因在於 IIS 預設以 GBK/GB2312 編碼 URL,Apache 則為 UTF-8。轉碼後即可正常取得中文參數。
MY_URI.php 擴展,不動核心,易維護升級permitted_uri_chars 需加入 + 號防空格攔截iconv 統一為 UTF-8