Nginx 实现 Rewrite 跳转

文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。

上一篇文章对Nginx的Location配置进行了讲解,本篇主要对于Nginx中的Rewrite跳转进行讲解。因为目前很多工作前端开发都会选择使用Nginx作为反向代理服务器,但是平时业务需要难免碰到重写URL,Nginx的Rewrite跳转有什么使用场景呢?

  • 公司更换域名需要访问旧域名时跳转到新域名
  • 请求静态文件跳转到CDN
  • 根据用户设备不同跳转到不同站点(pc端,移动端)

不得不说的是Apache服务器规则库很强大,做跳转也很简单,但是Nginx使用Rewrite实现跳转效率更高,所以这也是我们需要学习Nginx的Rewrite模块的目的所在。Rewrite是Nginx的静态重写模块,跳转的使用场景有以下几种情形:

  • 可以改变用户访问的URL
  • 可以将动态URL伪装成静态URL提供服务
  • 可以访问旧域名时跳转到新域名
  • 可以根据变量,目录,客户端信息等跳转不同的URL

Rewrite如何实现跳转?

Nginx利用ngx_http_rewrite_module模块解析和处理rewrite请求。Rewrite用于实现URL重写,其实有点类似于重定向功能,可以将用户的请求重写至别的目录,在一定程度上提高了网站安全性。Rewrite支持if条件判断,但不支持else判断。而且Rewrite需要PCRE支持,一次重定向最多可以跳转10次,超过10次将返回500错误。Rewrite模块包含set命令,可以创建变量用来记录条件标识或者传递变量到其他的Location中。Rewrite实际上就是使用Nginx已有的全局变量或者通过set命令设置的变量结合正则表达式实现URL重写。

Rewrite使用场景

在Nginx中使用Rewrite实现跳转有以下三种场景:

  • 直接用Rewrite进行匹配跳转
  • 使用if匹配全局变量进行跳转
  • 使用location匹配再进行跳转

所以说rewrite语句只允许放在server{ },if{ },location{ }中。接下来我们先看看if指令。

if指令

if指令用于条件匹配判断,根据判断结果选择不同的Nginx配置,在server或location中配置。Nginx中的if指令只支持单重判断,不支持多重判断。我们简单看个例子:

location /test{
> index index.html;

    if ( $scheme = http ){
        rewrite / https://www.niyueling.cn permanent;
    }  

    if  ($scheme = https ){
        echo "if ---> $scheme";
    }
   }

location上篇文章讲过了,这里不再细讲,接下来我们看下rewrite语法.

rewrite语法

  • rewrite regex replacement [flag]

rewrite将用户请求的URL基于正则表达式regex进行检查,匹配到时将其替换为正则表达式对应的新的URL。若在同一级配置模块中存在多个rewrite规则,则会自顶向下检查。replacement则为跳转后的内容。[flag]作为标识符用于控制循环机制,如果替换后的URL是以http或者https开头,则会直接301永久重定向。

flag参数介绍

rewrite语句有四种flag状态:redirect、permanent、break、last。前两种属于客户浏览器重新发起对新地址的请求,后两种是在WEB服务器内部实现跳转。

  • redirect #临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,有客户端重新发起请求,使用相对路径,http://或https://开头,状态码:302
  • permanent #永久重定向,以永久重定向的方式直接返回重写后生成的新URL给客户端,由客户端重新发起新的请求,状态码:301
  • last #重写完成后停止对当前location中后续的其他重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用
  • break #重写完成后停止对当前URL在当前location中后续的其他重写操作,而后直接跳转至重写规则匹配块之后的其他配置;结束循环,建议在location中使用

rewrite语法讲完了我们可以一起来看看如何实现几种方式跳转:

(1) 在location中将旧域名永久重定向到新域名

location / {
root /data/html;
index index.html;
rewrite / http://www.niyueling.cn permanent;
}

这里有必要提下临时重定向与永久重定向的区别:

临时重定向不会缓存新域名的解析记录,但是永久重定向会缓存新域名的解析记录。

(2) http自动跳转https

有时候公司项目需要,会要求整个网站皆使用https,这时候为了用户体验,我们需要在用户访问http站点的时候自动跳转到https站点中。

location / {
> root /opt/blog;
index index.html;
if ( $scheme = http ){
rewrite / https://www.niyueling.cn permanent;
}
}
上面配置其实就是如果用户请求协议为http的时候使用rewrite跳转到对应的https站点。但是if语句不能去掉,否则就会陷入死循环。

(3) 如果用户请求URL不存在跳转首页

location / {
root /opt/blog;
index index.html;
if ( !-f $request_filename ){
rewrite (.*) http://www.niyueling.cn;
}
}

(4) 实现防盗链

防盗链实际上是基于前端携带的referer实现,referer可以记录用户从哪个界面跳转而来的标志信息。Nginx可以通过ungx_http_referrer_module模块来检查请求的referer信息是否有效实现防盗链功能

location ^~ /test {
root /opt/blog;
index index.html;
valid_referers none blocked server_names .niyueling.cn www.niyueling.
api.online.test/v1/hostlist ~.google. ~.baidu.; #定义有效的referer
if ($invalid_referer) { #假如是使用其他的无效的referer访问:
return 403; #返回状态码403
}
}

如果喜欢我的文章,欢迎关注我的个人公众号

原文地址:https://www.cnblogs.com/niyueling/p/11563357.html

时间: 2024-12-09 16:39:58

Nginx 实现 Rewrite 跳转的相关文章

Nginx中 Rewrite学习笔记

路由重写是Web服务器中的一个很重要的基本功能.通过路由重写,可以结构化URL,更具语义化(对SEO有益).另外,分享出去的URL可能会因程序路由变动而导致URL失效,而路由的重写可以很好的解决这类问题. 适当的使用Rewrite功能,可以更我们带来很多的好处.Nginx中Rewrite的功能是基于perl语言兼容的正则表达式,所以在编译安装nginx之前,需要安装PREC库.Nginx中Rewrite功能实现是基于ngx_http_rewrite_module,所以确保安装了此模块. Rewr

Nginx的Rewrite规则与实例

通过Rewrite规则可以实现规范的URL.根据变量来做URL转向及选择配置,用好Rewrite有时起到事半功倍的效果. 语法 Nginx的Rewrite相比Apache的要好理解很多,主要使用指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令. rewrite 语法: rewrite regex replacement [flag]; 默认值: — 上下文: server, location, if 如果指定的正则表达式能匹配URI,此URI将被r

Nginx的rewrite应用

Rewrite主要的功能是实现URL重写,Nginx 的 Rewrite 规则采用 PCRE Perl 兼容正则表达式的语法进行规则匹配,如相使用 Nginx 的 Rewrite 功能,在编译 Nginx 前要编译安装 PCRE 库. 一,Nginx使用if进行条件匹配 Nginx可以用if进行条件匹配,语法规则类似C if (条件){...} ( 可用于: server,location )  ## 检查一个条件是否符合,如果条件符合,则执行大括号内的语句.不支持嵌套,不支持多条件 &&

Nginx强制http跳转https访问

Nginx强制http跳转https访问有以下几个方法 nginx的rewrite方法 可以把所有的HTTP请求通过rewrite重写到HTTPS上 配置 方法一 1 server{ 2 listen 80; 3 server_name XXXXX.com; //你的域名 4 rewrite ^(.*)$ https://XXXXXX.com permanent; 5 location ~ / { 6 index index.html index.php index.htm; 7 } 8 } 方

Rewrite跳转

Nginx服务中Rewrite的应用 Rewrite跳转场景 URL看起来更规范.合理 企业会将动态URL地址伪装成静态地址提供服务 网址换新域名后,让旧的访问跳转到新的域名上 服务端某些业务调整 Rewrite跳转实现 Rewrite实用场景 Nginx跳转需求的实现方式 使用rewrite进行匹配跳转 使用if匹配全局变量后跳转 使用location匹配再跳转 rewrite放在server{},if{},location{} 段中 对域名或参数字符串 使用if全局变量匹配 使用proxy_

nginx之rewrite相关功能

Nginx Rewrite相关功能 Nginx服务器利用ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,nginx的正则表达式底层依赖于PCRE库,PCRE是用perl语言写的:rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也

Rewrite跳转场景

Rewrite跳转场景 URL看起来更规范,合理 企业会将动态URL地址伪装成静态地址提供服务 网址换新域名后,让旧的访问跳转到新的域名上 服务端某些业务调整 Rewrite跳转实现 Rewrite实用场景 Nginx跳转需求的实现方式使用rewrite进行匹配跳转使用if匹配全局变量后跳转使用location匹配再跳转 rewrite放在server{},if{},location{}段中 对域名或参数字符串使用if全局变量匹配使用proxy_pass反向代理 常用的正则表达式元字符 字符 说

nginx 配置rewrite 笔记

nginx 配置rewrite笔记: 通过下面的示例来说明一下,1. 先说说location : location 表示匹配传入的url地址,其中配置符有多种,各种情况的意义不一样: location ^~ /public/ { root /data/wwwroot/a.php.abc.cc; } location ^~ /public/ 表示匹配以 "/public/" 开头的url,匹配成功执行其中的内容,执行完毕后停止并退出. location / { root /data/ww

nginx http强制跳转https

通过nginx的rewrite 进行301永久重定向,参考如下配置即可. server { listen  192.168.1.111:80; server_name test.com; rewrite ^(.*)$  https://$host$1 permanent; } 搭建此虚拟主机完成后,就可以将http://test.com的请求全部重写到https://test.com上了