当前位置 主页 > 服务器问题 > nginx问题汇总 >

    详解nginx配置url重定向-反向代理(2)

    栏目:nginx问题汇总 时间:2018-09-20 16:23


    可以在重写指令后面添加标记。 

    如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。 

    尾部的标记(flag)可以是以下的值:

    last - 完成重写指令,之后搜索相应的URI或location。 break - 完成重写指令。 redirect - 返回302临时重定向,如果替换字段用http://开头则被使用。 permanent - 返回301永久重定向。

    注 意如果一个重定向是相对的(没有主机名部分),nginx将在重定向的过程中使用匹配server_name指令的“Host”头或者 server_name指令指定的第一个名称,如果头不匹配或不存在,如果没有设置server_name,将使用本地主机名,如果你总是想让nginx 使用“Host”头,可以在server_name使用“*”通配符(查看http核心模块中的server_name)。例如:

    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;return 403;

    但是如果我们将其放入一个名为/download/的location中,则需要将last标记改为break,否则nginx将执行10次循环并返回500错误。

    location /download/ { rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break; return 403;}

    如果替换字段中包含参数,那么其余的请求参数将附加到后面,为了防止附加,可以在最后一个字符后面跟一个问号:

    rewrite ^/users/(.*)$ /show?user=$1? last;

    注意:大括号({和}),可以同时用在正则表达式和配置块中,为了防止冲突,正则表达式使用大括号需要用双引号(或者单引号)。例如要重写以下的URL:

    /photos/123456

    为:

    /path/to/photos/12/1234/123456.png

    则使用以下正则表达式(注意引号):

    rewrite "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png;

    如果指定一个“?”在重写的结尾,Nginx将丢弃请求中的参数,即变量$args,当使用$request_uri或$uri&$args时可以在rewrite结尾使用“?”以避免nginx处理两次参数串。 

    在rewrite中使用$request_uri将www.example.com重写到example.com:

    server { server_name www.example.com; rewrite ^ http://example.com$request_uri? permanent;}

    同样,重写只对路径进行操作,而不是参数,如果要重写一个带参数的URL,可以使用以下代替:

    if ($args ^~ post=100){ rewrite ^ http://example.com/new-address.html? permanent;}

    注意$args变量不会被编译,与location过程中的URI不同(参考http核心模块中的location)

    示例:当访问www.lansgg.com的时候跳转到www.Aries.com;

     server {  listen 80 default_server;  server_name  www.lansgg.com lansgg.com;  access_log  logs/lansgg.access.log main;  error_log  logs/lansgg.error.log;  root   /opt/nginx/nginx/html/lansgg;  index index.html;  rewrite ^/ http://www.Aries.com/;  }

    break 指令 可使用server, location, if 区域; 中止Rewirte,不在继续匹配

    last 指令 可server, location, if  区域;

    last与break的区别在于,last并不会停止对下面location的匹配。

    测验一下break与last的区别

     server { listen 80 default_server; server_name www.lansgg.com lansgg.com; access_log logs/lansgg.access.log main; error_log logs/lansgg.error.log; root  /opt/nginx/nginx/html/lansgg; index index.html; location /c1.html { rewrite /c1.html /c2.html break; } location /c2.html { return 508; } }[root@master sbin]# echo "c1" > /opt/nginx/nginx/html/lansgg/c1.html[root@master sbin]# echo "c2" > /opt/nginx/nginx/html/lansgg/c2.html