Nginx Rewrite

概述

Nginx作为反向代理服务器的首选,会有较多的跳转需求

Rewrite跳转场景

可以调整用户浏览的URL,看起来更规范,符合开发及产品人员的需求

为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务

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

根据特殊变量、目录、客户端的信息进行URL调整等

Rewrite跳转实现

通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但不支持else。需要PCRE支持。重写模块包含set指令set指令

Rewrite实际应用场景

使用rewrite进行匹配跳转

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

使用location匹配再跳转

Nginx表达式

常用的元字符

Nginx Rewrite基本操作

语法

rewrite <regex> <replacement> [flag];
regex:正则匹配规则
replacement:跳转后的内容
flag:表示支持的flag标记
flag标记说明 :last 相当于 Apache 的 [L] 标记,表示完成 rewrite
              break 本条规则匹配完成即终止,不再匹配后面的任何规则
              redirect 返回302临时重定向,浏览器会显示跳转后的URL地址,爬虫不会更新地址
              permanent 返回301临时重定向,浏览器会显示跳转后的URL地址,爬虫会更新地址

loaction分类

location = patt {}        精准匹配

location = patt {}         一般匹配

location ~ patt {}         正则匹配

正则匹配的表达式

~ :表示执行一个正则匹配,区分大小写、

~*:表示执行一个正则匹配,不区分大小写

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

!~*:表示执行一个正则匹配,不区分大小写不匹配

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

=:进行普通字符精确匹配,也就是完全匹配

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

Location优先级

和location表达式的类型有关,相同类型的表达式,字符串长的会优先匹配

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

^~类型表达式,匹配成功不再查找其他匹配项

正则表达式类型(~和`*)优先级次之

常规字符串匹配类型,按照前缀匹配

通用匹配(/),如果没有其他匹配,任何匹配都会被请求到

location优先级

匹配具体文件
(location = 完整路径)> (location ^~ 完整路径) > (location ~* 完整路径) > (location ~ 完整路径) > (location 完整路径) > (location /)

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

Rewire示例

准备两台服务器端和一台客户端,并在他们的host中添加下列内容

192.168.10.101 www.benet.com 

192.168.10.102 www.accp.com

将主配置文件中的server_name改为www.benet.com

基于域名跳转

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
 location / {
        root   html;
        index  index.html index.htm;

        if ($host = 'www.benet.com') 
          {
          rewrite ^/(.*)$ http://www.accp.com/$1 permanent; 
          }

    }
[root@localhost ~]# systemctl restart nginx

用客户端访问www.benet.com会直接跳转到www.accp.com上

基于客户端 IP 访问跳转

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

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

    #access_log  /var/log/nginx/host.access.log  main;


    set $rewrite true;
    if ($remote_addr = "192.168.10.51") {
        set $rewrite false;
    }
    if ($rewrite = true) {
    rewrite (.+) /maintenance.html;
    }

…………
[root@localhost ~]# systemctl restart nginx

先用客户端192.168.10.51访问,能正常访问www.benet.com,再用其他IP客户端访问,打开的是maintenance.html页面

基于旧域名跳转到新域名后面加目录

[root@localhost html]# cd /usr/local/nginx/html/
[root@localhost html]# mkdir -p bbs/post
[root@localhost html]# cd bbs/post
[root@localhost post]# echo "i am bbs">index.html
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf


server {
    listen       80;
    server_name  bbs.benet.com;        //需要改为bbs.benet.com

    #access_log  /var/log/nginx/host.access.log  main;

    location /post {
        rewrite (.+) http://www.benet.com/bbs$1 permanent;
    }
…………


[root@localhost ~]# systemctl restart nginx

在客户端浏览器地址栏输入 http://bbs.benet.com/post,会跳转到http://www.benet.com/bbs/post/

基于目录下所有 php 结尾的文件跳转

要求访问 http://www.benet.com/upload/1.php跳转到首页
[root@localhost post]# vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  bbs.benet.com;

    #access_log  /var/log/nginx/host.access.log  main;

    location ~* /upload/.*\.php$ {
        rewrite (.+) http://www.benet.com permanent;
    }
…………
[root@localhost ~]# systemctl restart nginx

浏览器访问 http://www.benet.com/upload/1.php会跳转到http://www.benet.com

基于最普通一条 url 请求的跳转


server {
    listen       80;
    server_name  bbs.benet.com;
    
    #access_log  /var/log/nginx/host.access.log  main;
    

    location ~* ^/1/test.html {
        rewrite (.+) http://www.benet.com permanent; 
    }   

…………

[root@localhost ~]# systemctl restart nginx

浏览器访问 http://www.benet.com/1/test.html 跳转到http://www.benet.com

  • 24
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值