Apache .htaccess匹配韩文GET查询的Rewrite规则执行失败求助
问题
我尝试在.htaccess中编写Rewrite规则,将包含韩文字符的搜索请求重定向至404页面,使用的规则如下:
RewriteEngine On RewriteCond %{QUERY_STRING} [\x{ac00}-\x{d7a3}] RewriteRule ^(.*)$ /404.html [R=404,L]
测试时提示正则表达式执行失败,但在PHP中使用带/u修饰符的相同正则却能正常工作:
if (preg_match('/[\x{ac00}-\x{d7a3}]/u', $string)) { echo "URL contains korean charachters"; }
请问该如何解决?
解决方案
核心原因
PHP的preg_match通过/u修饰符开启了UTF-8模式,支持\x{xxxx}格式的Unicode转义;但Apache的mod_rewrite默认正则引擎不支持这种Unicode转义语法,也未默认启用UTF-8模式,直接使用会导致正则解析失败。
方法1:兼容所有Apache版本(匹配UTF-8字节范围)
韩文Hangul Syllables(U+AC00至U+D7A3)的UTF-8编码是3字节序列,我们可以直接匹配这些字节组合来定位韩文字符:
RewriteEngine On # 匹配韩文音节的UTF-8字节范围 RewriteCond %{QUERY_STRING} ^.*(?:\xEA[\xB0-\xBF][\x80-\xBF]|\xEB[\x80-\xBF][\x80-\xBF]|\xEC[\x80-\xBF][\x80-\xBF]|\xED[\x80-\x9D][\x80-\xBF]|\xED\x9E[\x80-\xA3]).*$ [NC] # 直接返回404,无需重写路径 RewriteRule ^ - [R=404,L]
方法2:仅适用于Apache 2.4+(启用PCRE UTF-8模式)
Apache 2.4及以上版本的mod_rewrite支持PCRE的UTF-8模式,只需在正则开头添加(*UTF8)修饰符,即可识别Unicode转义语法:
RewriteEngine On # 添加(*UTF8)启用UTF-8模式,支持Unicode转义 RewriteCond %{QUERY_STRING} (*UTF8)[\x{ac00}-\x{d7a3}] RewriteRule ^ - [R=404,L]
内容的提问来源于stack exchange,提问作者was
相关产品推荐
相关产品推荐

