nginx重定向的过程(运维服务篇Nginx常用功能)

一、反向代理1、多域名跳转(location),我来为大家科普一下关于nginx重定向的过程?下面希望有你要的答案,我们一起来看看吧!

nginx重定向的过程(运维服务篇Nginx常用功能)

nginx重定向的过程

一、反向代理

1、多域名跳转(location)

server www.test.com

location / {

proxy_pass http://192.168.100.100:8080/web/

}

location /admin {

proxy_pass http://192.168.100.200:8080/admin

}

server www.mysite.com

location / {

proxy_pass http://192.168.100.110:8080/web/

}

注意;web后面的"/",如果web为文件,没问题;如果web为文件夹就必须加斜杠,不然会出错。

2、rewirite(重定向)

server {

server_name www.test.com;

rewirite ^/(.*)$ http://www.newtest.com/$1 permanent;

}

将(.*)作为正则匹配的第一个分组,$1.

www.test.com/a/b/c.html =>www.newtest.com/a/b/c.html

3.alias(别名)

location /i {

alias /var/www/html/images/;

}

请求/i/a.jpg资源时,Nginx会在服务器上查找/var/www/html/images/a.jpg。

/i 就是/var/www/html/images/的别名,也就是 /i == /var/www/html/images/

与root的区别是:/i会作为根目录后面的资源。如上面root中的资源请求为:/var/www/html/images/i

4.location(定位)

location = / {

configaaaa

}

location / {

configaaaa

}

location ^~ /images/ {

configaaaa

}

location ~* \.(gif|jpg|jpeg|swk)$ {

configaaaa

}

各符号的含义:

~ 表示区分大小写,且匹配

~* 表示不区分大小写,且匹配

!~ 表示区分大小写,且不匹配

!~* 表示不区分大小写,且不匹配

* 表示任意

^ 表示开头

$ 表示结尾

. 需要转义

5、特殊

location / {

autoindex on; #目录列表

}

#allow、deny允许和禁止某些ip

6、URL重写应用

if命令

比如,根据请求的资源存在与否进行URL重定向。

~ 表示区分大小写,且匹配

~* 表示不区分大小写,且匹配

!~ 表示区分大小写,且不匹配

!~* 表示不区分大小写,且不匹配

-f 和!-f 文件存在与否

-d 和!-d 目录存在与否

-e和!-e 文件或目录存在与否

-x和!-x 文件可执行与否

比如:

location ~* \.(gif|jpg|jpeg|swk)$ {

if (!-f $request_filename)

{

root /var/www/html/img;

}

if (!-f $request_filename)

{

root /var/www/html/imgaes;

}

}

会一次匹配,最后如果没有则会返回404错误。

rewrite命令

rewirite ^/(.*)$ http://www.newtest.com/$1 permanent;

最后一项为标记,常用的标记有:

last:表示完成rewrite之后搜索对应的URI或location

break:终止

redirect:302普通重定向

permanent :301永久重定向

set命令

一般为变量设置值。例如:

location / {

proxy_pass http://127.0.0.1:8000;

set $query $query_string;

rewirite /aaa http://www.newtest.com/?$query;

}

如果$query_string=111,如果请求/aaa则会重定向到http://www.nettest.com/?age=111

break命令

匹配到后,终止匹配


规则实战

Rewrite规则实战

Rewrite规则含义就是某个URL重写成特定的URL,从某种意义上说为了美观或者对搜索引擎友好,提高收录量及排名等。

Rewrite规则的最后一项参数为flag标记,支持的flag标记主要有以下几种:

last :相当于Apache里德(L)标记,表示完成rewrite;

break;本条规则匹配完成后,终止匹配,不再匹配后面的规则

redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址

permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

last和break用来实现URL重写,浏览器地址栏URL地址不变。

例如用户访问www.test.com,想直接跳转到网站下面的某个页面,www.test.com/new.index.html如何来实现呢?

我们可以使用Nginx Rewrite 来实现这个需求,具体如下:

在server中加入如下语句即可:

rewrite ^/$ http://www.test.com/index01.html permanent;

*代表前面0或更多个字符

代表前面1或更多个字符

?代表前面0或1个字符

^代表字符串的开始位置

$代表字符串结束的位置

。为通配符,代表任何字符

例如多个域名跳转到同一个域名,nginx rewrite规则写法如下:

server

{

listen 80;

server_name www.test.com test.com;

if ( $host != 'www.test.com' ) {

rewrite ^/(.*)$ http://www.test.com/$1 permanent;

}

当访问的文件和目录不存在时,重定向到某个php文件

if( !-e $request_filename )

{

rewrite ^/(.*)$ index.php last;

}

目录对换 /xxxx/123456 ---/xxxx?id=123456

rewrite ^/(. )/(\d ) /$2?id=$1 last;

浏览器请求头跳转

if( $http_user_agent ~ MSIE)

{

rewrite ^(.*)$ /ie/$1 break;

}

禁止访问以.sh,.flv,.mp3为文件后缀名的文件

location ~ .*\.(sh|flv|mp3|xml|rar|zip)$

{

return 403;

}

将jfedu.net跳转到www.jfedu.net

if ($host = 'test.net' ) {

rewrite ^/(.*)$ http://www.test.net/$1 permanent;

}

匹配用户浏览器代理信息:

if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" )

{

rewrite ^/$ http://m.test.net/ permanent;

}

Nginx-BBS论坛rewrite规则配置

rewrite ^([^\.]*)/group-([0-9] )-([0-9] )\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;

Nginx location规则匹配

1. "= ",字面精确匹配, 如果匹配,则跳出匹配过程。(不再进行正则匹配)

2. "^~ ",最大前缀匹配,如果匹配,则跳出匹配过程。(不再进行正则匹配)

3. / 不带任何前缀:最大前缀匹配,举例如下:

location / 代表以"/"开头的搜索匹配, 在没有正则表达式匹配的情况下才进行这个匹配(优先级最低)

4. "~ ",大小写相关的正则匹配

5. "~* " , 大小写无关的正则匹配

6. "@", Named location 不是普通的location匹配,而是用于location内部重定向的变量。

Location @apache

其中: 1、2、3 三种情况属于 location using literal string, 即使用普通字符串的location匹配;

4、5二种情况属于 location using regular expresstion,即使用正则表达式的location匹配;

location 匹配的优先级(与location在配置文件中的顺序无关)

= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。

普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。

^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。

最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。

location = / {

# 只匹配"/".

[ configuration A ]

}

location / {

# 匹配任何请求,因为所有请求都是以"/"开始

# 但是更长字符匹配或者正则表达式匹配会优先匹配

[ configuration B ]

}

location = /images/ {

# 匹配任何以 /images/ 开始的请求,并停止匹配 其它location

[ configuration C ]

root /tmp/;

}

location ~* \.(gif|jpg|jpeg)$ {

# 匹配以 gif, jpg, or jpeg结尾的请求.

# 但是所有 /images/ 目录的请求将由 [Configuration C]处理.

[ configuration D ]

Root /var/www/html/

}

请求URI例子:

/ -> 符合configuration A

/documents/document.html -> 符合configuration B

/images/1.gif -> 符合configuration C

/documents/1.jpg ->符合 configuration D

正常的优先级别为:

(location =) > (location 完整路径 >) >(location ^~ 路径) >(location ~* 正则) >(location 路径)


分享结束,谢谢支持

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页