Nginx重写功能
一. ngx_http_rewrite_module 模块
Nginx 服务器利⽤ ngx_http_rewrite_module 模块解析和处理 rewrite 请求,
此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安
装 PCRE 库,rewrite 是 nginx 服务器的重要功能之⼀,⽤于实现 URL 的重写
,URL 的重写是⾮常有⽤的功能,⽐如它可以在我们改变⽹站结构之后,不需要客
⼾端修改原来的书签,也⽆需其他⽹站修改我们的链接,就可以设置为访问,另外
还可以在⼀定程度上提⾼⽹站的安全性。
ngx_http_rewrite_module 模块会使用 PCRE 正则表达式更改用户请求的 URI、
返回重定向后 URI 指向的资源以及有条件地选择配置来更改请求 URI。
-
针对该模块提供的功能的配置指令有
- break
- if
- return
- rewrite
- rewrite_log
- set
- uninitialized_variable_warn
1.1 if 指令
if 指令⽤于条件匹配,并根据条件判断结果选择相应的 Nginx 配置,可以配置在
server 或 location 块中,ngx_http_rewrite_module 的 if 语法仅能使⽤ if
做单次判断。配置形式如下:
if (condition) {
action;
}
# 如果condition满足,则选择花括号内的动作执行;否则,匹配其它配置块的动作。
if 判断的条件一般会用到下面的匹配表达式:
# 匹配成功时if指令认为条件为true,执行if指定的配置指令;否则认为false,搜索匹配其它块内配置
= # ⽐较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false。
!= # ⽐较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false。
~ # 表⽰在匹配过程中区分⼤⼩写字符,(可以通过正则表达式匹配),满⾜匹配条件为真,不满⾜为假。
!~ # 为区分⼤⼩写字符且字符不匹配,不匹配为真,字符匹配为假。
~* # 表⽰在匹配过程中不区分⼤⼩写字符,(可以通过正则表达式匹配),满⾜匹配条件为真,不满⾜为假。
!~* # 为不区分⼤⼩字符且字符不匹配,匹配为假,不匹配为真。
~,!~,~*,!~*等匹配规则在匹配时可以使用括号来打组,使用$1~$9来进行后向引用,或者在if语句块内重用。
-f 和 ! -f # 判断请求的⽂件是否存在和是否不存在
-d 和 ! -d # 判断请求的⽬录是否存在和是否不存在。
-x 和 ! -x # 判断⽂件是否可执⾏和是否不可执⾏。
-e 和 ! -e # 判断请求的⽂件或⽬录是否存在和是否不存在(包括⽂件,⽬录,软链接)。
. # 匹配除换行符以外的任意字符
\w # 匹配字母或数字或下划线或汉字
\s # 匹配任意的空白符
\d # 匹配数字
\b # 匹配单词的开始或结束
^ # 匹配字符串的开始
$ # 匹配字符串的结束
* # 重复零次或更多次
+ # 重复一次或更多次
? # 重复零次或一次
{
n} # 重复n次
{
n,} # 重复n次或更多次
{
n,m} # 重复n到m次
*? # 复任意次,但尽可能少重复
+? # 重复1次或更多次,但尽可能少重复
?? # 重复0次或1次,但尽可能少重复
{
n,m}? # 重复n到m次,但尽可能少重复
{
n,}? # 重复n次以上,但尽可能少重复
\W # 匹配任意不是字母,数字,下划线,汉字的字符
\S # 匹配任意不是空白符的字符
\D # 匹配任意非数字的字符
\B # 匹配不是单词开头或结束的位置
[^x] # 匹配除了x以外的任意字符
[^aeiou] # 匹配除了aeiou这几个字母以外的任意字符
注:如果$变量的值为空字符串,则 if 指令认为该条件为 false,其他条件为 true。
在 nginx-1.0.1 及以前的版本中,以 0 开头的任意字符串都认为是 false。
示例:
http {
......
# pc virtual host #
server {
server_name pc.suosuoli.cn;
listen 80;
listen 443 ssl;
ssl_certificate /apps/nginx/certs/www.suosuoli.cn.crt;
ssl_certificate_key /apps/nginx/certs/www.suosuoli.cn.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
location / {
root /apps/nginx/html/suosuoli;
index index.html;
default_type text/html;
if ( $scheme = http ){
echo "Warning!!!!";
}
if ( $scheme = https ){
echo "Nice!!!!";
}
if ( !-e $request_filename ) {
echo "Oops, file not find.";
echo $request_filename;
}
}
}
......
}
访问https://pc.suosuoli.cn
访问http://pc.suosuoli.cn
访问http://pc.suosuoli.cn/not_exist_file
访问https://pc.suosuoli.cn/not_exist_file
server {
server_name pc.suosuoli.cn;
listen 80;
listen 443 ssl;
ssl_certificate /apps/nginx/certs/www.suosuoli.cn.crt;
ssl_certificate_key /apps/nginx/certs/www.suosuoli.cn.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
location /