上次谈到过Nginx和中文URL的问题,这几天又加深了认识。 多分享几个关于Nginx Rewrite的经验。
Nginx匹配指定中文URL的方法:
rewrite "(*UTF8)^x{66f4}x{6539}$" /index.html last;
这个会将 http://www.cslog.cn/%E6%9B%B4%E6%94%B9 重定向到http://www.cslog.cn/index.html。
‘/%E6%9B%B4%E6%94%B9′是中文URL ‘/更改’, x{66f4}x{6539}是这两个汉字的Unicode编码。
注意配合PCRE 7.9以上版本使用,详细看Nginx和中文URL的问题。
Nginx匹配URL中中文参数的方法:
如果要将 http://www.cslog.cn/index.php?title=%E6%9B%B4%E6%94%B9 重定向到http://www.cslog.cn, 则要使用
location = /index.php$ {
if ($args_title =%E6%9B%B4%E6%94%B9 ) {
rewrite ^ /;
}
}
在这里, ‘?title=%E6%9B%B4%E6%94%B9′ 是不能用上例那里的rewrite捕捉到的, 而要使用$arg_参数名这样的方式处理。 而且在这里, ‘%E6%9B%B4%E6%94%B9′是不用特别转换的,直接放上去就可以了。
还要注意到 location后面的 ~, *~, ^~, =或空是有不同的效果的。详细参看nginx的官方手册。
让Nginx在同时识别到两个参数的情况下重定向的方法
假设要在例如 http://www.cslog.cn/index.php?title=%E6%9B%B4%E6%94%B9&lang=Zh-tw 这样的URL,只有在lang=Zh-tw参数存在,并且title参数也存在(不管它的值)的情况下才重定向, 要求会苛刻些,因为nginx自身没有并列的逻辑处理能力,但可以使用如下的方法曲线解决:
location = /index.php {
set $redirect "";
# 检查是否存在"title"参数:
if ( $arg_title ) {
set $redirect "Y";
}
# 检查lang参数是否为 "Zh-tw":
if ( $arg_lang =Zh-tw ) {
set $redirect "${redirect}ES";
}
# 看看条件是否同时成立 "YES":
if ( $redirect = YES ) {
rewrite ^ / last;
}
....
}
转载请注明: 转自船长日志, 本文链接地址: http://www.cslog.cn/Content/nginx-rewrite-chinese/
我之前用PHP正则匹配中文怎么记得好像是4e00-9fa5 呵呵