再谈Nginx Rewrite, 中文URL和其它

上次谈到过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/

此条目发表在 信息处理, 站长文档 分类目录,贴了 , , , , , , , , , , , , , 标签。将固定链接加入收藏夹。

再谈Nginx Rewrite, 中文URL和其它》有 1 条评论

  1. 代码之美 说:

    我之前用PHP正则匹配中文怎么记得好像是4e00-9fa5 呵呵

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>