Nginx的rewrite功能和apache一样,主要是实现URL地址的重定向。Nginx的rewrite功能是由PCRE软件支持,rewrite模块即 ngx_http_rewrite_module
模块。rewrite机制从某种意义上可以说为了美观或者搜索引起的友好搜索,提高排名等
1、rewrite语法规则
rewrite regex replacement [flag]
rewrite:rewrite重写的关键字不可省略
regex:这里写的是正则表达式
replacement:这里是替换内容
flag:这里是flag标记
flag标记 | 说明 |
---|---|
last | 也就是apache里的(L)标记,表示完成rewrite,URL地址不会改变 |
break | 本条规则匹配成功后,会停止匹配,不再匹配后面的规则,URL地址不会改变 |
redirect | 返回302临时重定向,浏览器地址会显示跳转后的URL地址 |
permanent | 返回301永久重定向,浏览器地址栏显示跳转后的URL地址,Nginx返回response状态码301 |
符号 | 说明 |
---|---|
* | 代表前面0或者多个字符 |
+ | 代表前面1或者多个字符 |
? | 代表前面0或1个字符 |
^ | 代表字符串的开始位置 |
$ | 代表字符串结束位置 |
$n | 代表字符串结束第n个参数 |
. | 通配符,代表任何字符 |
参数 | 介绍 |
---|---|
-f | 判断文件是否存在 返回值true为存在 |
!-f | 判断文件是否存在 返回值false为不存在 |
-d | 判断目录是否存在 返回值true为存在 |
!-d | 判断目录是否存在 返回值true为不存在 |
-e | 判断文件或目录是否存在 返回值true为存在 |
!-e | 判断文件或目录是否存在 返回值true为不存在 |
-x | 判断文件是否可执行 返回值true为可执行 |
!-x | 判断文件是否可执行 返回值true为不可执行 |
2、rewrite实例:
- 实例1 多域名跳转到同一域名
server{
listen 80;
server_name www.oyhdo.com oyhdo.com ;
if($host != 'www.oyhdo.com' ){
rewrite ^/(.*)$ http://www.oyhdo.com/$1 permanent;
}
}
1、访问test目录下的文件或目录不存在时,则跳转到test2下面的此文件或者目录,跳转后会将URL进行转换:
server{
listen 80;
server_name www.oyhdo.com;
if(!-e $request_filename){
rewrite ^/test/(.*)$ http://www.oyhdo.com/test2/$1 permanent;
}
}
2、访问test目录下的文件或目录不存在时,则重定向到index.html文件,跳转后URl不会进行转换:
server{
listen 80;
server_name www.gofor.com;
if(!-e $request_filename){
rewrite ^/test/(.*)$ index.html last;
}
}
3、目录切换,表示将原目录转换成其他目录,【0-9a-z】表示转换后目录名称
server{
listen 80;
server_name www.oyhdo.com;
if(!-e $request_filename){
rewrite ^/test/([0-9a-z]+)/([0-9a-z]+)/(.*)$ http://www.oyhdo.com/test/$1$2$3 permanent;
}
}
如下,当匹配到浏览代理为Android和iPhone时进行重定向 test目录下的文件,改变访问的地址
server{
listen 80;
server_name www.oyhdo.com;
if ( $http_user_agent ~* ("Android")|(iPhone)){
rewrite ^/test/(.*)$ http://www.oyhdo.com/test/$1 permanent;
}
}