rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。
rewrite语法格式及参数语法说明如下
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容flag标记
关键字:其中关键字error_log不能改变(此关键字必须有)
正则:perl兼容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement
flag标记:rewrite支持的flag标记
flag标记说明:
last本条规则匹配完成后,继续向下匹配新的location URI规则
break本条规则匹配完成即终止,不再匹配后面的任何规则
redirect返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
rewrite适用位置
server(配置服务段),location,if
例子(编辑nginx的主配置文件vi /usr/local/nginx/conf/nginx.conf):
location / {
if ($remote_addr = 127.0.0.1) {
rewrite ^/(.*) http://www.czlun.com/ permanent;
}
root html;
index index.html index.htm;
}
⭐⭐⭐⭐特别注意⭐⭐⭐⭐⭐⭐
在重写地址的时候
if ($remote_addr = 127.0.0.1) {
rewrite ^/(.*) http://www.czlun.com/ permanent;
}
需要特别注意if的后面必须有空格,(xxx)后面和{也必须有一个空格。不然后报错。
说明:
rewrite:为固定关键字,表示开始进行rewrite匹配规则
regex部分是^/(.*) ,这是一个正则表达式,匹配完整的域名和后面的路径地址(^表示正则开始,/(.*)匹配所有的)
replacement: 部分是http://www.czlun.com/$1$1,是取自regex部分()里的内容。匹配成功后跳转到的URL。
flag部分permanent表示永久301重定向标记,即跳转到新的http://www.czlun.com/$1地址上
以上的$remote_addr是系统的全局变量,是nginx内部定义的参数。我们在使用的时候可以查看里面根据什么去判断地址的重写。以下是较为常见的nginx全局变量的参数
$args |
|
$contentlength |
|
$content_type |
|
$document_root |
|
$host |
|
$http_user_agent |
|
$http_cookie |
|
$limit_rate |
|
$request_method |
|
$remote_addr |
|
$remote_port |
|
$remote_user |
|
$request_filename |
|
$scheme |
|
$server_protocol |
|
$server_addr |
|
$server_name |
|
$server_port |
|
$request_uri |
|
$uri |
|
$document_uri |
|
以下是正则表达式简单说明:
字符 | 描述 |
\ | 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$” |
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” |
+ | 匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“oll”,但不能匹配“o” |
? | 匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,"?"等效于"{0,1}" |
. | 匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式。 |
(pattern) | 匹配括号内pattern并可以在后面获取对应的匹配,常用$0...$9属性获取小括号中的匹配内容,要匹配圆括号字符需要\(Content\) |
示例1:
if ($request_method = POST) {
rewrite ^/(.*) http://www.baidu.com.com/ break;//如果请求的方式是post则跳转到百度首页
#return 405;//跳转到405页面
}
示例2:
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location ~ \.(jpg|png|jpeg|gif|) {
rewrite ^/(.*)$ https://www.baidu.com/ break;
}
}
解释:如果访问地址为localhost:80/log.png(后缀带有jpg,png,jpeg,fig)一类的访问地址,就直接跳转到百度首页,break是不再匹配后面的任何规则。