nginx url rewrite规则配置实例(对比apache url rewrite规则)

发布时间:2020-07-25编辑:脚本学堂
分享一些nginx url rewrite规则的例子,nginx url地址重写的综合教程,详细介绍了nginx rewrite规则的语法,相关指令,nginx url rewrite规则编写实例等。

一、nginx rewrite(nginx url地址重写)

rewrite 主要的功能就是实现url的重写,nginx的rewrite规则采用pcre,perl兼容正则表达式的语法规则匹配,如果需要nginx的rewrite功能。
在编译nginx之前,需要编译安装pcre库。

通过rewrite规则,可以实现规范的url、根据变量来做url转向及选择配置。

nginx rewrite规则演示图:

nginx rewrite规则 

1、nginx rewrite规则中的if指令
规则语法:
 

复制代码 代码示例:
if ($http_user_agent ~MSIE){ 
rewrite ^(.*)$/msie/$1 break
 } 
 
if (!-f$request_filename){ 
  rewrite ^/img/(.*)$/site/$host/images/$1 last; 
}

2、nginx rewrite语法规则:
变量名:
变量名可以使用"="或"!="运算符
 ~  符号表示区分大小写字母匹配
 ~* 符号表示不区分大小写字母匹配
 !~ 和 !~ 与~  !~ 相反
 -f 和 !-f   用来判断文件是否存在
 -d 和 !-d   用来判断目录是否存在
 -e 和 !-e   用来判断文件或目录是否存在
 -x 和 !-x   用来判断文件是否可以执行
  也支持$1到$9位置参数

3、return指令

例子,如果访问的URL以.sh .bash 结尾,返回状态码403
 

复制代码 代码示例:
location ~ .*.(sh|bash)?$ 

  return 403; 
}  

4、rewrite指令
rewrite指令的最后一项参数为flag标记,支持的flag标记主要有以下几种: 
last :相当于apache里德(L)标记,表示完成rewrite; 
break;本条规则匹配完成后,终止匹配,不再匹配后面的规则 
redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址 
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 
last和break用来实现URL重写,浏览器地址栏URL地址不变 

例子,将访问/b跳转到/bbs目录上去:
 

复制代码 代码示例:
location /b   { 
autoindex  on; 
   alias /usr/local/nginx/html/redhat;
   rewrite ^/b/?$ /bbs permanent; 
 
   } 
  location /bbs { 
 autoindex on; 
  alias /usr/local/nginx/html/bbs; 
  } 

二、nginx url rewrite规则编写实例
1,将原来要访问/b的目录重写为/bbs

核心语句:
 

rewrite ^/b/?$ /bbs permannet; 

2,根据不同的浏览器将得到不同的结果。
 

复制代码 代码示例:
if ($http_user_agent ~ Firefox) { 
  rewrite ^(.*)$ /firefox/$1 break; 
  } 
 
  if ($http_user_agent ~ MSIE) { 
rewrite ^(.*)$ /msie/$1 break; 
   } 
 
 if ($http_user_agent ~ Chrome) { 
  rewrite ^(.*)$ /chrome/$1 break; 
 }  

3,nginx rewrite规则如何防盗链
根据Referer信息防止盗链::
 

复制代码 代码示例:
location ~*.(gif|jpg|png|swf|flv)${ 
valid_referers none blocked www.jb200.com*.test.com; 
if ($invalid_referer) 
 rewrite ^/(.*) http://www.jb200.com/error.html  
  } 

4,实现域名跳转:
 

复制代码 代码示例:
server { 
 listen   80; 
 server_name  jbxue.example.com; 
 write ^(.*)$  http://zhang.example.com/$1 permanent; 
 location / { 
 root   html; 
 index  index.html index.htm; 
 } 

三、Nginx Rewrite规则相关指令
Nginx Rewrite规则相关指令有if、rewrite、set、return、break等,其中rewrite是最关键的指令。

一个简单的Nginx Rewrite规则语法如下:
 

rewrite ^/b/(.*).html /play.php?video=$1 break;

加上if语句:
 

if (!-f $request_filename)
rewrite ^/img/(.*)$ /site/$host/images/$1 last;

四、nginx与apache的rewrite规则实例对比

简单的Nginx和Apache 重写规则区别不大,基本上能够完全兼容。

例如:

Apache Rewrite 规则:
 

复制代码 代码示例:

RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L]

RewriteRule ^/ceshi/$ /zl/ceshi.php [L]

RewriteRule ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [L]

RewriteRule ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 [L]

Nginx Rewrite 规则:
 

复制代码 代码示例:

rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last;

rewrite ^/ceshi/$ /zl/ceshi.php last;

rewrite ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last;

rewrite ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 last;

由以上示例可以看出,Apache的Rewrite规则改为Nginx的Rewrite规则,其实很简单:Apache的RewriteRule指令换成Nginx的rewrite指令,Apache的[L]标记换成Nginx的last标记,中间的内容不变。

如果Apache的Rewrite规则改为Nginx的Rewrite规则后,使用nginx -t命令检查发现nginx.conf配置文件有语法错误,那么可以尝试给条件加上引号。例如一下的Nginx Rewrite规则会报语法错误:
 

rewrite ^/([0-9]{5}).html$ /x.jsp?id=$1 last;

加上引号就正确了:
 

rewrite “^/([0-9]{5}).html$” /x.jsp?id=$1 last;

五、apache与nginx的rewrite规则在url跳转时有细微的区别:

Apache Rewrite 规则:
 

RewriteRule ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301,L]

Nginx Rewrite 规则
 

rewrite ^/html/tagindex/([a-zA-Z]+)/.*$ http://$host/$1/ permanent;

Nginx Rewrite 规则的置换串中增加了“http://$host”,这是在Nginx中要求的。

另外,Apache与Nginx的Rewrite规则在变量名称方面也有区别,例如:

apache rewrite 规则:
 

RewriteRule ^/user/login/$ /user/login.php?login=1&forward=http://%{HTTP_HOST} [L]

nginx rewrite 规则:

rewrite ^/user/login/$ /user/login.php?login=1&forward=http://$host   last;

Apache与Nginx Rewrite 规则的一些功能相同或类似的指令、标记对应关系:

Apache的RewriteCond指令对应Nginx的if指令;
Apache的RewriteRule指令对应Nginx的rewrite指令;
Apache的[R]标记对应Nginx的redirect标记;
Apache的[P]标记对应Nginx的last标记;
Apache的[R,L]标记对应Nginx的redirect标记;
Apache的[P,L]标记对应Nginx的last标记;
Apache的[PT,L]标记对应Nginx的last标记;

允许指定的域名访问本站,其他域名一律跳转到http://www.aaa.com

apache rewrite 规则:
 

RewriteCond %{HTTP_HOST}^(.*?).domain.com$
RewriteCond %{HTTP_HOST}!^qita.domain.com$
RewriteCond %{DOCUMENT_ROOT}/market/%1/index.htm -f
RewriteRule ^/wu/$ /market/%1/index.htm [L]

nginx的if指令不支持嵌套,也不支持and、or等多条件匹配,相比于apache的rewritecond,显得麻烦一些,但是,可以通过下一页的nginx配置写法来实现这个示例:

Nginx Rewrite 规则
 

if ($host ~* ^(.*?).domain.com$) set $var_wupin_city $1;
 set $var_wupin ‘1′;

if ($host ~* ^qita.domain.com$)

set $var_wupin ‘0′;

 if (!-f $document_root/market/$var_wupin_city/index.htm)

 set $var_wupin ‘0′;

if ($var_wupin ~ ‘1′)

rewrite ^/wu/$ /market/$var_wupin_city/index.htm last;
}

nginx url rewrite语法

语法: rewrite regex replacement flag

默认: none

作用域: server, location, if

This directive changes URI in accordance with the regular expression and the replacement string. Directives are carried out in order of appearance in the configuration file.

这个指令根据表达式来更改URI,或者修改字符串。指令根据配置文件中的顺序来执行。

Be aware that the rewrite regex only matches the relative path instead of the absolute URL. If you want to match the hostname, you should use an if condition, like so:

注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句。

rewrite只是会改写路径部分的东东,不会改动用户的输入参数,因此这里的if规则里面,你无需关心用户在浏览器里输入的参数,rewrite后会自动添加的,因此,我们只是加上了一个?号和后面我们想要的一个小小的参数 ***https=1就可以了。

nginx url rewrite规则参考:
 

~ 为区分大小写匹配
~* 为不区分大小写匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
last 相当于Apache里的[L]标记,表示完成rewrite,呵呵这应该是最常用的
break 终止匹配, 不再匹配后面的规则
redirect 返回302临时重定向 地址栏会显示跳转后的地址
permanent 返回301永久重定向 地址栏会显示跳转后的地址
$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri