解决.htaccess Rewrite规则无法处理中文字符等特殊字符的问题
解决Rewrite规则适配多语言(含中文)的问题
嘿,我来帮你搞定这个Rewrite规则无法处理中文等特殊字符的问题!
首先得搞清楚问题出在哪:中文这类非ASCII字符在浏览器发起请求时,会自动被编码成UTF-8的百分号格式(比如“测试”会变成%E6%B5%8B%E8%AF%95)。如果你的原规则没考虑这种编码后的URI,或者服务器没配置支持UTF-8解析,自然就匹配失败或者参数传错了。
下面是具体的修改步骤,一步步来:
1. 先让服务器支持UTF-8 URI解析
在你的.htaccess最开头加上这两行配置,确保Apache能正确识别UTF-8编码的请求:
# 设置默认字符集为UTF-8 AddDefaultCharset UTF-8 # 如果你的参数里可能带斜杠,加上这个(可选) AllowEncodedSlashes NoDecode
2. 修改Rewrite规则,适配所有字符
假设你的原规则大概是这样的(只匹配了字母数字这类简单字符):
RewriteRule ^([a-zA-Z0-9_-]+)$ somePage.php?parm=$1 [L]
这种正则肯定抓不住中文。我们把它改成能匹配所有编码后字符的形式,再加上关键标志保证参数正确传递:
修改后的完整规则:
RewriteEngine On # 只重写不存在的文件和目录,别影响真实资源 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 匹配所有字符,转义特殊符号,避免双重编码 RewriteRule ^(.*)$ somePage.php?parm=$1 [B,NE,L]
这里的几个标志得解释下:
^(.*)$:把请求URI里的所有内容都捕获下来,不管是中文编码后的百分号串,还是其他特殊字符[B]:自动把捕获到的参数里的特殊字符转义(比如空格变%20),确保PHP能正确接收[NE]:禁止Apache对参数做二次转义,不然会出现%E4%B8%AD%E6%96%87变成%25E4%25B8%25AD%25E6%2596%2587这种双重编码的乱码- 那两行
RewriteCond:避免把真实存在的文件或目录也给重写了,比如你的somePage.php本身是存在的,就不会被自己的规则匹配到
3. 在PHP里正确解码参数
最后到PHP这边,得把编码后的参数解码成正常中文:
// 获取参数并解码,rawurldecode比urldecode更适合处理URI编码 $parm = isset($_GET['parm']) ? rawurldecode($_GET['parm']) : ''; // 保险起见,强制转成UTF-8防止乱码 $parm = mb_convert_encoding($parm, 'UTF-8', 'auto');
这样改完之后,不管是中文、日文、特殊符号,你的Rewrite规则都能完美处理啦!
内容的提问来源于stack exchange,提问作者Oscardr
相关产品推荐
相关产品推荐

