首页 » 网站推广 » centosphprewrite技巧_Nginx核心内容Nginx Rewrite 跳转

centosphprewrite技巧_Nginx核心内容Nginx Rewrite 跳转

访客 2024-12-04 0

扫一扫用手机浏览

文章目录 [+]

· 理解Rewrite

· 节制Nginx的正则表达式

centosphprewrite技巧_Nginx核心内容Nginx Rewrite 跳转

· 节制Rewrite的语法

centosphprewrite技巧_Nginx核心内容Nginx Rewrite 跳转
(图片来自网络侵删)

· 理解常见Rewrite示例

10.1 案例剖析

10.1.1 案例概述

现在Nginx已经成为很多公司作为前端反向代理做事器的首选,在实际事情中每每会碰着很多跳转(重写URL)的需求。
比如改换域名后须要保持旧的域名能跳转到新的域名上、某网页发生改变须要跳转到新的页面、网站防盗链等等需求。
如果在后端利用的Apache做事器,虽然也能做跳转,规则库也很强大,但是用Nginx跳转效率会更高,这也是学习本章的目的所在。

10.1.2 案例前置知识点

1.Rewrite跳转场景

Rewrite跳转场景紧张包括以下几种:

1)可以调度用户浏览的URL,看起来更规范,合乎开拓及产品职员的需求。

2)为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址供应做事。

3)网址换新域名后,让旧的访问跳转到新的域名上。
例如,访问京东的360buy.com会跳转到jd.com。

4)根据分外变量、目录、客户真个信息进行URL调度等。

2. Rewrite跳转实现

Nginx是通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但不支持else。
其余该模块须要PCRE支持,应在编译Nginx时指定PCRE支持,默认已经安装。
根据干系变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样的循环最多可以实行10次,超过后Nginx将返回500缺点。
同时,重写模块包含set指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、通报参数到其他location、记录做了什么等等。
rewrite功能便是,利用Nginx供应的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。

3. Rewrite实际场景

在实际事情场景,Nginx跳转需求有三种办法可实现。
可以直接用rewrite进行匹配跳转,也可以利用if匹配全局变量后跳转,其余还可以利用location匹配再跳转,以是rewrite只能放在server{},if{},location{}段中,例如location只能对域名后边的撤除通报的参数外的字符串起浸染,例如http://www.domain.com/index.php?id=1只对/index.php重写。
如果想对域名或参数字符串起浸染,可以利用if全局变量匹配,也可以利用proxy_pass反向代理。

10.1.3 案例环境

1. 本案例实验环境

表10-1是本章案例的详细环境。

2. 案例需求

通过对正则表达式的学习和理解,根据不同级别的优先级实现常见的跳转需求。

3. 案例实现思路

1)正则表达式的理解。

2)Rewrite语法。

3)Location的分类和优先级先容。

4)举例解释加深印象和理解程度。

10.2 案例履行

10.2.1 Nginx正则表达式

学习Rewrite之前要对正则表达式要很熟习,表1-2中列举出一些常用的正则表达式元字符。
要深刻理解和学习每个元字符的含义,并且多动手进行实验,在实际生产环境中要结合多个元字符一起利用。

表10-2 常用的正则表达式元字符

10.2.2 Rewrite语法

Rewrite命令的语法如下所示。

rewrite <regex> <replacement> [flag];

· regex:正则

· replacement:跳转后的内容

· flag:rewrite支持的flag标记

flag标记解释:

· last:相称于Apache的[L]标记,表示完成rewrite。

· break:本条规则匹配完成即终止,不再匹配后面的任何规则。

· redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url(由于是临时)。

· permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url。

如果后面不跟flag标记,那么默认是302临时重定向。
在实际事情场景中,还有另一种return指定。
由于301和302不能大略的只返回状态码,还必须有重定向的URL,这便是return指令无法返回301,302的缘故原由了。
last 和 break 差异有点难以理解:

last一样平常写在server和if中,而break一样平常利用在location中。
last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配。

10.2.3 Location分类

location大致可以分为三类:

· location = patt {} [精准匹配]

· location patt {} [一样平常匹配]

· location ~ patt {} [正则匹配]

精准匹配和一样平常匹配不须要做详细的解释,紧张是正则匹配,下面便是正则匹配的一些表达式,须要多加牢记。

· ~:表示实行一个正则匹配,区分大小写。

· ~:表示实行一个正则匹配,不区分大小写。

· !~:表示实行一个正则匹配,区分大小写不匹配。

· !~:表示实行一个正则匹配,不区分大小写不匹配。

· ^~:表示普通字符匹配。
利用前缀匹配。
如果匹配成功,则不再匹配其他location。

· =:进行普通字符精确匹配。
也便是完备匹配。

· @:它定义一个命名的 location,利用在内部定向时,例如 error_page, try_files。

10.2.4 Location优先级

在Nginx的location和配置中location的顺序没有太大关系。
和location表达式的类型有关,相同类型的表达式,字符串长的会优先匹配。

以下是按优先级排列解释:

1. 等号类型(=)的优先级最高。
一旦匹配成功,则不再查找其他匹配项。

2. ^~类型表达式。
一旦匹配成功,则不再查找其他匹配项。

3. 正则表达式类型(~和~)的优先级次之。

4. 常规字符串匹配类型。
按前缀匹配。

5. 通用匹配(/),如果没有其它匹配,任何要求都会匹配到。

从功能看rewrite和location彷佛有点像,都能实现跳转,紧张差异在于rewrite是在同一域名内变动获取资源的路径,而location是对一类路径做掌握访问或反向代理,还可以proxy_pass到其他机器。
很多情形下rewrite也会写在location里,它们的实行顺序是:

1. 实行server块里面的rewrite指令。

2. 实行location匹配。

3. 实行选定的location中的rewrite指令。

下面根据不同的Location优先级进行示例解释。

location = / {

# 精确匹配 / ,主机名后面不能带任何字符串。

[ configuration A ]

}

location / {

# 由于所有的地址都以 / 开头,以是这条规则将匹配到所有要求,但是正则和最长字符串会优先匹配。

[ configuration B ]

}

location /documents/ {

# 匹配任何以 /documents/ 开头的地址,匹配符合往后,还要连续往下搜索,只有后面的正则表达式没有匹配到时,这一条才会起浸染。

[ configuration C ]

}

location ~ /documents/abc {

# 匹配任何以 /documents/abc 开头的地址,匹配符合往后,还要连续往下搜索,只有后面的正则表达式没有匹配到时,这一条才会起浸染。

[ configuration D ]

}

location ^~ /images/ {

# 匹配任何以 /images/ 开头的地址,匹配符合往后,停滞往下匹配。

[ configuration E ]

}

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

# 匹配所有以gif,jpg或jpeg结尾的要求,然而,所有要求/images/下的图片会被 [ configuration E ] 处理,由于^~的优先级更高。

[ configuration F ]

}

location /images/abc {

# 最长字符匹配到 /images/abc,优先级最低。

[ configuration G ]

}

location ~ /images/abc {

# 匹配以/images/abc开头的,优先级次之。

[ configuration H ]

}

location /images/abc/1.html {

# 匹配以/images/abc/1.html文件,如果和正则~ /images/abc/1.html比较,正则优先级更高。

[ configuration I ]

}

location优先级总结:

1. 如果是匹配某个详细文件:

(location = 完全路径) > (location ^~ 完全路径) > (location ~ 完全路径) > (location ~ 完全路径) > (location 完全路径) > (location /)

2. 如果是用目录做匹配访问某个文件:

(location = 目录) > (location ^~ 目录/) > (location ~ 目录) > (location ~ 目录) > (location 目录) > (location /)

10.2.5 Rewrite常赐教例

1. 安装Nginx源

[root@localhost ~]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

2. 安装Nginx软件包

[root@localhost ~]# yum install -y nginx

3. 修正Nginx默认站点配置文件

紧张修正/etc/nginx/conf.d/default.conf文件中如下两行赤色字体:

server {

listen 80;

server_name www.domain.com;

#charset koi8-r;

access_log /var/log/nginx/www.domain.com-access.log main;

location / {

root /usr/share/nginx/html;

index index.html index.htm;

}

#error_page 404 /404.html;

......//省略部分

}

4. 启动Nginx

[root@localhost ~]# systemctl start nginx

把稳事变:做每一步场景测试之前请确定这个域名可以正常解析,每做下一个场景之前请删除上一个场景的配置,其余打消浏览器缓存。

1)基于域名的跳转,现在公司旧域名www.domain.com有业务需求有变更,须要利用新域名www.newdomain.com代替,但是旧域名不能废除,须要跳转到新域名上,而且后面的参数保持不变。

在/etc/nginx/conf.d/default.conf文件里的location /下面添加如下内容

if ($host = 'www.domain.com')

{

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

}

[root@localhost ~]# systemctl reload nginx

域名直接跳转,按F12可以清楚的看到从旧域名www.domain.com跳转到了新域名www.newdomain.com上,状态码是301永久重定向。
页面效果如图10.1所示。

图10.1

域名后面加参数跳转,由于在代码中很多的要求是带参数的,以是要担保参数都能正常跳转。
浏览器输入仿照访问http://www.domain.com/test/1/index.php(虽然这个要求内容是不存在的)跳转到http://www.newdomain.com/test/1/index.php,从headers里面可以看到301实现了永久重定向跳转,而且域名后的参数也正常跳转。
页面效果如图10.2所示。

图10.2

2)基于客户端IP访问跳转,例如今天公司业务版本上线,所有IP访问任何内容都显示一个固定掩护页面,只有公司IP访问正常。

在/etc/nginx/conf.d/default.conf文件里添加如下内容:

set $rewrite true;

if ($remote_addr = \公众192.168.9.230\"大众) {

set $rewrite false;

}

if ($rewrite = true) {

rewrite (.+) /maintenance.html;

}

location = /maintenance.html {

root /usr/share/nginx/html;

}

[root@localhost ~]# echo \公众Website is Maintaining, Please visit later!\"大众 > /usr/share/nginx/html/maintenance.html

[root@localhost ~]# systemctl reload nginx

只有IP为192.168.9.230能正常访问,其它地址都是掩护页面,利用一个局域网的其它IP地址用浏览器访问http://www.domain.com域名和加参数都是要求的maintenance.html页面的内容,而且状态码是200,如图10.3所示。

图10.3

浏览器利用http://www.domain.com/test带参数访问也是显示掩护页面内容,如图10.4所示。

图10.4

3)基于旧域名跳转到新域名后面加目录,例如现在访问的是http://bbs.domain.com,现在须要将这个域名下面的发帖都跳转到http://www.domain.com/bbs,把稳保持域名跳转后的参数不变。

在/etc/nginx/conf.d/default.conf文件里修正赤色字体并添加如下内容:

server_name bbs.domain.com;

location /post {

rewrite (.+) http://www.domain.com/bbs$1 permanent;

}

[root@localhost ~]# systemctl reload nginx

仿照利用浏览器访问http://bbs.domain.com/post/1.php跳转到http://www.domain.com/bbs/post/1.php,如图10.5所示。

图10.5

4)基于参数匹配的跳转,例如现在访问http://www.domain.com/100-(100|200)-100.html跳转到http://www.domain.com页面。

在/etc/nginx/conf.d/default.conf文件里添加如下内容:

if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {

rewrite (.) http://www.domain.com permanent;

}

[root@localhost ~]# systemctl reload nginx

利用浏览器访问http://www.domain.com/100-100-100.html,如图10.6所示。

图10.6

利用浏览器访问http://www.domain.com/100-200-100.html,如图10.7所示。

图10.7

5)基于目录下所有php结尾的文件跳转,访问http://www.domain.com/upload/1.php跳转到首页。

在/etc/nginx/conf.d/default.conf文件里添加如下内容:

location ~ /upload/.\.php$ {

rewrite (.+) http://www.domain.com permanent;

}

浏览器访问http://www.domain.com/upload/1.php,如图10.8

图10.8

6)基于最普通一条url要求的跳转,访问一个详细的页面跳转到首页。

在/etc/nginx/conf.d/default.conf文件里添加如下内容:

location ~ ^/1/test.html {

rewrite (.+) http://www.domain.com permanent;

}

浏览器访问http://www.domain.com/1/test.html跳转到首页,如图10.9所示。

图10.9

关于Nginx rewrite本章的内容就这么多。
其实在实际事情中远远不止这些场景,而且会更加繁芜繁琐,希望大家能举一反三,多加练习。

相关文章

介绍直播新纪元,轻松进入直播的五大步骤

随着互联网技术的飞速发展,直播行业在我国逐渐崛起,越来越多的人选择通过直播这一新兴媒介展示自己、分享生活、传递价值。对于许多新手来...

网站推广 2025-01-03 阅读1 评论0

介绍相机美颜原理,科技与美学的完美结合

随着科技的发展,智能手机的摄像头功能日益强大,美颜相机成为了许多人拍照的首选。美颜相机不仅满足了人们对于美的追求,更在视觉上给人带...

网站推广 2025-01-03 阅读1 评论0

介绍磁铁的制造,科学与艺术的完美结合

磁铁,一种神秘的物质,自古以来就吸引了无数人的目光。它不仅具有独特的磁性,还能在工业、医疗、科研等领域发挥重要作用。磁铁是如何制造...

网站推广 2025-01-03 阅读1 评论0

介绍电瓶激活方法,让电池焕发新生

随着科技的不断发展,电动汽车逐渐成为人们出行的首选。而电瓶作为电动汽车的核心部件,其性能直接影响着车辆的续航里程和行驶体验。新购买...

网站推广 2025-01-03 阅读1 评论0