Nginx、PCRE和中文URL(UTF8编码)rewrite路径重写匹配问题
最近遇到了使用Nginx 重写中文UTF8编码路径的问题。 才发现默认情况下Nginx的rewrite是不支持UTF8匹配的。 比如:
rewrite ^/(..)$ /2个字符文章.html break; #用2个点
可以匹配到 /ab 或 /51, 但 /汉字 是匹配不到的。 我测试了一下, 要匹配两个字的 /汉字 路径, 得用
rewrite ^/(……)$ /2个汉字文章.html break; #要用六个点
如果要让 ^/(..)$ 匹配到2个汉字字符,得开启Nginx对UTF8字符的正则支持, 准确点说是开启Nginx使用的PCRE库的对UTF8字符的支持。因为Nginx的rewrite模块是调用PCRE来处理正则的。 如果PCRE没有问题,Nginx支持UTF8编码的重写样式是:
rewrite "(*UTF8)^/(..)$" /2个字符文章.html break;
#注意(*UTF8)前缀和引号的加入。
因为PCRE只有7.9以上的版本才支持这个(*UTF8)开头,所以系统上的PCRE一定要使用7.9以上的版本。 另外,编译PCRE时一定要开启UTF8的支持。 即使用(–enable-utf8)参数。 检查系统的PCRE版本和是否支持UTF8编码可以使用pcretest -C
命令。执行后会显示如下的报告:
PCRE version 8.13 2011-08-16
Compiled with
UTF-8 support
Unicode properties support
Newline sequence is LF
R matches all Unicode newlines
Internal link size = 2
POSIX malloc threshold = 10
Default match limit = 10000000
Default recursion depth limit = 10000000
Match recursion uses stack
显示“UTF-8 support”就是支持UTF8编码了。
如果Nginx调用的PCRE为7.9以下的版本,使用 rewrite “(*UTF8)^/(..)$” /2个字符文章.html break; 这种形式的重写,在执行nginx -t检查时会出现如下的错误提示:
[emerg]: pcre_compile() failed: (*VERB) not recognized in “(*UTF8)^、……
如果Nginx调用的是7.9以上版本的PCRE,但是PCRE安装时没打开UTF8的支持开关,则会出现如下的错误提示:
nginx: [emerg] pcre_compile() failed: this version of PCRE is not compiled with PCRE_UTF8 support in “(*UTF8)^/…
解决办法是安装最新版本的的PCRE,并打开UTF8支持,方法如下(以当前8.13版的PCRE为例):wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.13.tar.gz
tar zxvf pcre-8.13.tar.gz
cd pcre-8.13
./configure --enable-utf8 --enable-unicode-properties
make
make install
然后重新编译安装Nginx。 Nginx默认会打开rewrite模块,并会自动查找系统上已经安装了的PCRE。 如果Nginx查找不到已经安装在系统上的PCRE, 或者系统上有多个PCRE, nginx调用了不支持UTF8的、或低版本的PCRE时(我遇到了后一种情况,并花费了很长的时间解决这个问题,这也是我为什么写这篇总结文章在这里给大家分享的原因。。。),可以在编译安装Nginx时指定PCRE源文件。例如:
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.13.tar.gz
tar zxvf pcre-8.13.tar.gz
wget http://nginx.org/download/nginx-1.0.8.tar.gz
tar zxvf nginx-1.0.8.tar.gz
cd nginx-1.0.8
./configure
--with-pcre=../pcre-8.13
注意,如果接着直接make && make install的话, PCRE因为没有启用UTF8, nginx将不能支持UTF8重写, 所以在这一种,我动了一点小手脚:打开./objs/Makefile 文件,找到以下段落:
../pcre-8.13/Makefile: objs/Makefile
cd ../pcre-8.13
&& if [ -f Makefile ]; then $(MAKE) distclean; fi
&& CC="$(CC)" CFLAGS="-O2 -fomit-frame-pointer -pipe "
./configure --disable-shared
在–disable-shared后加上 –enable-utf8和 –enable-unicode-properties参数, 即变成:../pcre-8.13/Makefile: objs/Makefile
cd ../pcre-8.13
&& if [ -f Makefile ]; then $(MAKE) distclean; fi
&& CC="$(CC)" CFLAGS="-O2 -fomit-frame-pointer -pipe "
./configure --disable-shared --enable-utf8 --enable-unicode-properties
然后再make, make install。 最后关闭nginx并重启nginx(这里不能用nginx -s reload)。这样nginx就支持中文UTF8编码的url重写了。
转载请注明: 转自船长日志, 本文链接地址: http://www.cslog.cn/Content/nginx-pcre-utf8-rewrite/
Nginx、PCRE和中文URL(UTF8编码)rewrite路径重写匹配问题的更多相关文章
- 中文字符utf-8编码原则
UTF-8是一种变长字节编码方式.对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0:如果是 多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字 ...
- 我对JavaWeb中中文URL编码的简单总结
1.application/x-www-form-urlencoded 它是一种编码类型.当URL地址里包含非西欧字符的字符串时,系统会将这些字符转换成application/x-www-form-u ...
- Perl中文/unicode/utf8/GB2312之间的转换
参考:http://daimajishu.iteye.com/blog/959239不过具测试,也有错误:原文如下: # author: jiangyujieuse utf8; ##在最后一个例子, ...
- URL地址编码和解码
0. 参考 [整理]关于http(GET或POST)请求中的url地址的编码(encode)和解码(decode) python3中的urlopen对于中文url是如何处理的? 中文URL的编码问题 ...
- 萌新笔记——C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)
最近在建词典,使用Trie字典树,需要把字符串分解成单个字.由于传入的字符串中可能包含中文或者英文,它们的字节数并不相同.一开始天真地认为中文就是两个字节,于是很happy地直接判断当前位置的字符的A ...
- C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)
最近在建词典,使用Trie字典树,需要把字符串分解成单个字.由于传入的字符串中可能包含中文或者英文,它们的字节数并不相同.一开始天真地认为中文就是两个字节,于是很happy地直接判断当前位置的字符的A ...
- 再谈Nginx Rewrite, 中文URL和其它
上次谈到过Nginx和中文URL的问题,这几天又加深了认识. 多分享几个关于Nginx Rewrite的经验. Nginx匹配指定中文URL的方法:rewrite "(*UTF8)^x{66 ...
- 判断URL中的中文参数是GB2312还是Utf-8编码
如两个URL字符串: &q=%E8%A3%99%E5%AD%90&style=grid&seller_type=taobao &q=%CE%D0%C2%D6%D4%F6 ...
- Nginx 使用中文URL,中文目录路径
Nginx 使用中文URL,中文目录路径 分类: linux2012-05-03 11:04 2672人阅读 评论(0) 收藏 举报 nginxurl服务器translationcentosserve ...
随机推荐
- MySQL中SYSDATE()和NOW()函数的区别和联系
MySQL中有5个函数需要计算当前时间的值: NOW.返回时间,格式如:2012-09-23 06:48:28 CURDATE,返回时间的日期,格式如:2012-09-23 CURTIME,返回时间, ...
- Git 学习(二)版本库创建
Git 版本库创建 什么是版本库(repository)? 可理解为文件仓库.由Git管理每个文件的新增.修改及删除,但这个仓库可以追溯历史.可还原至任意历史节点. 版本库创建 创建一个版本库非常简单 ...
- (转载)iPhone开发视频教程 Objective-C部分 (51课时)
感谢好人的无私贡献!来源:http://www.cnblogs.com/aimeng/p/3370012.html 第一.二章 OC基础语法 iPhone开发教程 第一章 OC基础语法 i ...
- java设计模式2--抽象工厂模式(Abstract Factory)
本文地址:http://www.cnblogs.com/archimedes/p/java-abstract-factory-pattern.html,转载请注明源地址. 抽象工厂模式(别名:配套) ...
- java 内存泄漏和内存溢出
参考:https://blog.csdn.net/eff666/article/details/52784724 1.内存溢出 内存溢出:OOM(OutOfMemoryError)异常,即程序需要内 ...
- Microsoft Office Word 2007 文档结构图突然变小的解决办法
前记: 一个word文档不知道修改了什么,突然发现文档结构图显示的文字变得非常的小了. 用ctrl+鼠标滚轮只能放大或是缩小行间距,对文字没有什么变化. 解决办法: 1.打开文档结构图 点击视图,勾选 ...
- Tapable 0.2.8 入门
[原文:Tapable 0.2.8 入门] tapable是webpack的核心框架(4.0以上版本的API已经发生了变化),是一个基于事件流的框架,或者叫做发布订阅模式,或观察者模式,webpack ...
- [Angular-Scaled web] 3. Basic State with ui-router
1. Install ui-route, include js file in html and add dependence in js file. bower install angular-ui ...
- FileItem 出现部分中文乱码解决办法
首先要进行两处的修改: 第一:如果你使用了上传文件的包, 如:ServletFileUpload sfu = new ServletFileUpload(factory); sfu.setHeader ...
- 深入理解Git (三) - 微命令上篇
1 git hash-object 曾经讲过Git用Hash值作为Git对象的名字,那么详细是哪个命令呢? 我们能够先改动一个文件: echo "hongchangfirst" & ...