企业网站部署与优化--Nginx rewrite配置

前言

● 该ngx_http_rewrite_module模块用于使用PCRE正则表达式更改请求URI,返回重定向并有条件地选择配置

一:Rewrite

1.1:Rewrite跳转场景

URL看起来更规范、合理

企业会将动态URL地址伪装成静态地址提供服务

网址换新域名后,让旧的访问跳转到新的域名上

服务端某些业务调整

1.2:Rewrite跳转实现

在这里插入图片描述

1.3:Rewrite实用场景

Nginx跳转需求的实现方式

使用 rewrite进行匹配跳转

使用if匹配全局变量后跳转

使用 location匹配再跳转

rewrite放在 server{},if{}, location{} 段中

对域名或参数字符串

使用if全局变量匹配

使用 proxy_pass反向代理

1.4:正则表达式

字符 说明
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或多次
+ 匹配前面的字符一次或多次
匹配前面的字符零次或一次
. 匹配初“\n”之外的任何单个字符
\ 将后面的字符标记为一个特殊字符或一个原义字符或一个向后引用
\d 匹配纯数字
{n} 重复n次
{n,} 重复n次或更多次
[c] 匹配单个字符c
[a-z] 匹配a-z小写字母的任意一个
[a-zA-Z] 匹配a-z小写字母或A-Z大写字母的任意一个

二:Rewrite命令

rewrite  <regex>(正则) <replacement>(跳转后的内容)  [flag] (rewrite支持的flag标记)

2.2:flag标记说明

标记 说明
last 相当于Apache的[L]标记,表示完成rewrite
break 本条规则匹配完成即终止,不再匹配后面的任何规则
reddirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url
permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url

2.3:last和break比较

last break
使用场景 一般写在server和if中 一般用在location中
URL匹配 不终止重写后的url匹配 终止重写后的url匹配

三:location

3.1:location分类

ocation = patt {} [精准匹配]

ocation patt {} [一般匹配 ]

location ~ patt {} [正则匹配]

3.1.1:正则匹配的常用表达式

标记 说明
~ 执行一个正则匹配,区分大小写
~* 执行一个正则匹配,不区分大小写
!~ 执行一个正则匹配,区分大小写不匹配
!~* 执行一个正则匹配,不区分大小写不匹配
^~ 普通字符匹配;使用前缀匹配。如果匹配成功,则不再匹配其他location
= 普通字符精确匹配。也就是完全匹配
@ 定义一个命名的location,使用在内部定向时

3.2:location的优先级

相同类型的表达式,字符串长的会优先匹配
按优先级排列
= 类型
^~ 类型表达式
正则表达式 和✳ 类型
常规字符串匹配类型,按前缀匹配
通用匹配(/),如果没有其他匹配,任何请求都会匹配到

3.3:rewrite和 location不同

相同点
都能实现跳转

不同点
rewrite是在同一域名内更改获取资源的路径

location是对一类路径做控制访问或反向代理,还可以 proxy_pass到其他机器

write会写在 location里,执行顺序

执行 server块里面的 rewrite指令

执行 location匹配

执行选定的 location中的 rewrite指令

3.4:location优先级规则

匹配某个具体文件
( location = 完整路径)>( location ^~ 完整路径)>( location ~✳完整路径)>( location ~ 完整路径)>( location完整路径)>( location /)
用目录做匹配访问某个文件
( location = 目录)>( location ^~ 目录)>( location ~ 目录)>
( location ~* 目录)>( location 目录)>( location /)

3.5:location优先级的示例

location = / {	'//精确匹配 /,主机名后面不能带任何字符串'
    [configuraion A ]	
}

location / {	'//所有的地址都以/开头,这条规则将匹配到所有请求,但正则和最长字符串会优先匹配'
    [configuraion B ]
}

location /documents/ {		'//匹配任何以/documents/开头的地址,当后面的正则表达式没有匹配到时,才起作用'
    [configuraion C ]
}

location ~ /documents/abc {		'//匹配任何以/documents/abc开头的地址,当后面的正则表达式没有匹配到时,才会起作用'
    [configuraion D ]
}

location ^~ /images/ {	'//以/images/开头的地址,匹配符合后,停止往下匹配'
    [configuraion E ]
}

location ~*\.(gif|jpg|gpeg)$ {	'//匹配所有以 gif, jpg或jpeg结尾的请求, Images/下的图片会被 [configuration E]处理,因为^~的优先级更高'
    [configuraion F ]
}

location /images/abc {	'//最长字符匹配到 /images/abc,优先级最低'
    [configuraion G ]
}

location ~ /images/abc {	'//以/ Images/abc开头的,优先级次之'
    [configuraion H ]
}

location /images/abc/1.html {	'//如果和正则 ~ images/abc/1.htm相比,正则优先级更高'
    [configuraion I ]

四、应用实例

手工编译nginx或者yum安装nginx

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

一台centos7服务器(IP地址为192.168.100.80)

一台Windows主机(IP地址为192.168.100.77)

4.1:基于域名的跳转

4.1.1:需求

现在公司旧域名www.old.com有业务需求有变更,需要使用新域名www.new.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变

4.1.2:centos服务器配置

####配置DNS
[root@localhost local]# yum install bind -y
[root@localhost local]# vim /etc/named.conf
修改监听地址:127.0.0.1修改为any,localhost修改为any
[root@localhost local]# vim /etc/named.rfc1912.zones 
zone "old.com" IN {		'//添加此段'
        type master;
        file "old.com.zone";
        allow-update { none; };
zone "new.com" IN {		'//添加此段'
        type master;
        file "new.com.zone";
        allow-update { none; };
};
[root@localhost local]# cd /var/named
[root@localhost named]# cp -p named.localhost kgc.com.zone
[root@localhost named]# vim kgc.com.zone 
www IN  A       192.168.100.80		'//末行添加'
[root@localhost named]# cp -p old.kgc.zone newkgc.com.zone
[root@localhost named]# vim /usr/local/nginx/conf/nginx.conf
    server {
        listen       80;
        server_name  www.old.com;	'//修改域名'
        ....
 location / {	'//添加此段域名跳转'
                if ($host = "www.kgc.com"){
                        rewrite ^/(.*)$ http://www.newkgc.com/$1 permanent;
                }
        }
....
[root@localhost named]# vim /usr/local/nginx/html/index.html 
<h1>this is old web</h1>	'//修改主页内容'
[root@localhost named]# systemctl start nginx.service 
[root@localhost named]# systemctl start named
[root@localhost named]# systemctl stop firewalld.service 
[root@localhost named]# setenforce 0

在这里插入图片描述

4.1.3:验证

在这里插入图片描述
在这里插入图片描述

4.2:基于客户端IP访问跳转

4.2.1:需求:

今天公司业务版本上线,所有P访问任何内容都显示一个固定维护页面,只有公司IP(192.168.100.77)访问正常

4.2.2:centos服务器配置

[root@promote named]# vim /etc/nginx/conf.d/default.conf 

    listen       80;
    server_name  www.kgc.com;
    
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;
    #判断标志$rewrite
    set $rewrite true;
    #允许公司内部访问,更改标志位false
    if ($remote_addr = "192.168.100.77"){
     set $rewrite false;
    }
    #如果不是公司IP,加上后缀作为标识
     if ($rewrite = true) {
      rewrite (.+) /error.html;
      }
      #匹配标记进行跳转站点
      location = /error.html  {
         root /usr/share/nginx/html;
         [root@promote named]# cd /usr/share/nginx/html/
[root@promote html]# ls
50x.html  index.html
[root@promote html]# vim error.html
[root@promote html]# systemctl restart nginx

在这里插入图片描述
在这里插入图片描述

4.2.3:验证

公司内部ip(192.168.100.77)可以直接访问
在这里插入图片描述
公司外部的ip访问就是error页面
在这里插入图片描述

4.3:基于旧,新域名跳转并加目录

4.3.1:需求:

基于旧域名跳转到新域名后面加目录,例如现在访问的是htp://bbs.kgc.com/post,现在需要将这个域名下面的发帖都跳转到http://www.kgc.com/bbs注意保持域名跳转后的参数不变

4.3.2:centos服务器配置

[root@localhost named]# vim /usr/local/nginx/conf/nginx.conf
'//删除掉刚刚设置的基于IP地址访问的跳转配置'
    server {
        listen       80;
        server_name  bbs.kgc.com;	'//修改域名'

        #charset koi8-r;

        #access_log  /var/log/nginx/www.kgc.com.access.log  false;

        localtion /post {	'//添加跳转的网页'
                rewrite (.+) http://www.kgc.com.bbs$1 permanent;
        }
[root@localhost named]# vim /var/named/kgc.com.zone 
bbs IN  A       192.168.100.80		'//原本的www修改为bbs'
重启两个服务

在这里插入图片描述

在这里插入图片描述

4.3.3:验证

访问这个网址
在这里插入图片描述
发现跳转成新的网址了
在这里插入图片描述

4.4:基于参数匹配的跳转

4.4.1:需求

例如现在访问http://www.old.com/100-(100|200)-100.html跳转到http://www.new.com页面

4.4.2:centos服务器配置

[root@promote ~]# vim /etc/nginx/conf.d/default.conf 

server {
    listen       80;
    server_name  www.kgc.com;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;
    if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
    rewrite (.*) http://www.kgc.com permanent;
    }

在这里插入图片描述

4.4.3:验证

访问这个网址
在这里插入图片描述
跳转了
在这里插入图片描述

4.5:基于目录下所有php文件跳转

4.5.1:需求

访问一个具体的页面跳转到首页

4.5.2:centos服务器配置

需求:访问http:www.kgc.com/upload/1.php跳转到首页

[root@promote named]# vim /etc/nginx/conf.d/default.conf 

server {
    listen       80;
    server_name  www.kgc.com;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;
    location ~* /upload/.*\.php$ {
       rewrite (.+) http://www.kgc.com  permanent;
      }

在这里插入图片描述

4.5.3: 验证

访问这个网站
在这里插入图片描述
跳转到首页了
在这里插入图片描述

4.6:基于最普通的url请求的跳转

4.6.1:需求

要求:访问一个具体的页面跳转到首页
验证:浏览器访问http://www.kgc.com/1/test.html跳转到首页

4.6.2:配置

vim /etc/nginx/conf.d/default.conf 

server {
    listen       80;
    server_name  www.kgc.com;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;
    location ~* ^/1/test.html {
       rewrite (.+) http://www.kgc.com permanent;
      }

在这里插入图片描述

4.6.3:验证

访问这个网址
在这里插入图片描述
跳转到首页了
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_47151650/article/details/107942131