rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。
rewrite语法格式及参数语法说明如下
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flag标记
正则: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/$1 permanent;
}
root html;
index index.html index.htm;
}
⭐⭐⭐⭐特别注意⭐⭐⭐⭐⭐⭐
在重写地址的时候
if ($remote_addr = 127.0.0.1) {
rewrite ^/(.*) http://www.czlun.com/$1 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 | 这个变量等于请求行中的参数,同$query_string |
$contentlength | 请求头中的Content-length字段。 |
$content_type | 请求头中的Content-Type字段。 |
$document_root | 当前请求在root指令中指定的值。 |
$host | 请求主机头字段,否则为服务器名称。 |
$http_user_agent | 客户端agent信息 |
$http_cookie | 客户端cookie信息 |
$limit_rate | 这个变量可以限制连接速率。 |
$request_method | 客户端请求的动作,通常为GET或POST。 |
$remote_addr | 客户端的IP地址。 |
$remote_port | 客户端的端口。 |
$remote_user | 已经经过Auth Basic Module验证的用户名。 |
$request_filename | 当前请求的文件路径,由root或alias指令与URI请求生成。 |
$scheme | HTTP方法(如http,https)。 |
$server_protocol | 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 |
$server_addr | $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。 |
$server_name | 服务器名称。 |
$server_port | 请求到达服务器的端口号。 |
$request_uri | 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。 |
$uri | 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。 |
$document_uri | 与$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是不再匹配后面的任何规则。