nginx(地址重写)

rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。

rewrite语法格式及参数语法说明如下

rewrite          [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/$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是不再匹配后面的任何规则。

你可能感兴趣的:(nginx)