文章目录

  • 常见的Nginx正则表达式
  • location
    • location分为三类
    • location常用的匹配规则
    • location 优先级
    • location 示例说明
    • 三个匹配规则定义
  • rewrite
    • rewrite 跳转实现
    • rewrite执行顺序
    • rewrite语法格式
    • flag标记说明
  • rewrite 示例
    • 基于域名的跳转
    • 基于客户端IP的访问跳转
    • 基于旧域名跳转到新域名后面加目录
    • 基于参数匹配的跳转
    • 基于目录下所有 php 结尾的文件跳转

常见的Nginx正则表达式

^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d :匹配纯数字
{n} :重复 n 次
{n,} :重复 n 次或更多次
{n,m} :重复 n 到 m 次
[] :定义匹配的字符范围
[c] :匹配单个字符 c
[a-z] :匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符

location

location分为三类

  • 精准匹配:location = / {}
  • 一般匹配:location / {}
  • 正则匹配:location ~ / {}

location常用的匹配规则

=   :进行普通字符精确匹配,也就是完全匹配。
^~  :表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。
~   :区分大小写的匹配。
~*  :不区分大小写的匹配。
!~  :区分大小写的匹配取非。
!~* :不区分大小写的匹配取非。

location 优先级

  • 首先精确匹配 =
  • 其次前缀匹配 ^~
  • 其次是按文件中顺序的正则匹配 *
  • 然后匹配不带任何修饰的前缀匹配
  • 最后是交给 / 通用匹配

location 示例说明

(1)location = / {}
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location  /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。(2)location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
但若后面是正则表达式会和最长字符串优先匹配(最长匹配)(3)location /documents/ {}
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条(4)location /documents/abc {}
匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条(5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条(6)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则(7)location /images/abc {}
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在(8)location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条(9)location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正则 ~ /images/abc/1.html 相比,正则优先级更高优先级总结:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)

三个匹配规则定义

  • 第一个必选规则

    直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
    这里是直接转发给后端应用服务器了,也可以是一个静态首页

location = / {proxy_pass http://tomcat_server/;
}
  • 第二个必选规则

    处理静态文件请求,这是nginx作为http服务器的强项
    有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

location ^~ /static/ {root /webroot/static/;
}location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {root /webroot/res/;
}
  • 第三个规则

    通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
    非静态文件请求就默认是动态请求

location / {proxy_pass http://tomcat_server;
}

rewrite

rewrite功能就是使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记实现URL重写以及重定向。例如:
更换域名后需要保持旧的域名能够转到新的域名上
某网页发生改变需要跳转到新的页面
网站防盗链
等等需求。

注意:rewrite只能放在server{},location{},if{}中,并且默认只能对域名后面的除去传递的参数外的字符串起作用。
例如:http://www.lisi.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写。

rewrite 跳转实现

  • Nginx:通过ngx_http_rewrite_module模块支持URL重写、支持if条件判断,但不支持else
  • 跳转:从一个location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
  • PCRE支持:perl兼容正则表达式的语法规则匹配
  • 重写模块set指令:创建新的变量并为其赋值

rewrite执行顺序

  • 第一优先:执行server块里面的rewrite指令
  • 第二优先:执行location匹配
  • 第三优先:执行选定的location中的rewrite指令

rewrite语法格式


语法rewrite<regex><replacement><flag>;
regex:表示正则匹配规则
replacement:表示跳转后的内容
flag:表示rewrite支持的flag标记

flag标记说明

  • last :本条规则匹配完成后,继续向下匹配新的location URI规则,一般用在 server 和 if 中。
  • break :本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中。
  • redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。
  • permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

rewrite 示例

基于域名的跳转

旧域名www.sheng.com因某种原因发生改变,需要使用www.mo.com代替,但要求旧域名不能废除,需要跳转到新域名上,后面的参数也保存不变

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.sheng.com;charset utf-8;access_log  /var/log/nginx/www.sheng.com.access.log;location / {if ($host = 'www.sheng.com'){rewrite ^/(.*)$ http://www.mo.com/$1 permanent;}root   html;index  index.html index.htm;}
}echo "192.168.249.10 www.mo.com www.sheng.com" >> /etc/hostssystemctl restart nginx

在浏览器中访问http://www.sheng.com/1.html
会跳转到www.mo.com/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。

基于客户端IP的访问跳转

今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP:192.168.249.10访问正常。

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.sheng.com;charset utf-8;access_log  /var/log/nginx/www.sheng.com.access.log;#设置是否合法的IP标记;设置变量$rewrite,变量值为boole值trueset $rewrite true;#判断是否为合法IP;当客户端IP为192.168.249.10时,将变量值设为false,不进行重写if ($remote_addr = "192.168.249.10"){set $rewrite false;}#除了合法IP,其它都是非法IP,进行重写跳转维护页面#当变量值为true时,进行重写if ($rewrite = true){#重写在访问IP后边插入/weihu.html,例如192.168.184.11/weihu.htmlrewrite (.+) /weihu.html;}location = /weihu.html {#网页返回/var/www/html/weihu.html的内容root /var/www/html;}location / {root   html;index  index.html index.htm;}
}mkdir -p /var/www/html/
echo "<h1>As server maintenance, please visit later, thank you.</h1>" > /var/www/html/weihu.html
echo "192.168.249.10 www.sheng.com" >> /etc/hosts
systemctl restart nginx



浏览器访问
只有 IP 为 192.168.249.10 能正常访问,其它地址都是维护页面

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

现在访问的是 http://lisi.test.com,现在需要将这个域名下面的访问都跳转到http://www.test.com/lisi

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  lisi.test.com;charset utf-8;access_log  /var/log/nginx/lisi.test.com.access.log;#添加;这里的$1为位置变量,代表/postlocation /post {rewrite (.+) http://www.test.com/lisi$1 permanent;}location / {root   html;index  index.html index.htm;}
}mkdir -p /usr/local/nginx/html/lisi/post
echo "this is 1.html" > /usr/local/nginx/html/lisi/post/1.html
echo "192.168.249.10 lisi.test.com www.test.com" >> /etc/hosts
systemctl restart nginx.service
使用浏览器访问
http://lisi.test.com/post/1.html 跳转到 http://www.test.com/lisi/post/1.html

基于参数匹配的跳转

现在访问http://www.test.com/100-(100|200)-100(任意数字).html 跳转到http://www.test.com页面。

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.test.com;charset utf-8;access_log  /var/log/nginx/www.test.com.access.log;if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {rewrite (.+) http://www.test.com permanent;}location / {root   html;index  index.html index.htm;}
}echo "192.168.249.10 www.test.com" >> /etc/hosts
systemctl restart nginx浏览器访问
http://www.test.com/100-200-100.html 或
http://www.test.com/100-100-100.html 跳转到http://www.test.com页面。

如果出现返回码304,可使用ctrl+F5强制刷新,并重新输入网址即可成功

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

要求访问 http://www.test.com/upload/abc.php 跳转到首页。

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.test.com;charset utf-8;access_log  /var/log/nginx/www.test.com.access.log;location ~* /upload/.*\.php$ {rewrite (.+) http://www.test.com permanent;
}location / {root   html;index  index.html index.htm;
}
}echo "192.168.249.10 www.test.com" >> /etc/hosts
systemctl restart nginx浏览器访问
http://www.test.com/upload/abc.php 跳转到http://www.test.com页面。


web服务之Nginx中的location匹配与rewrite重写跳转相关推荐

  1. Nginx的location匹配与rewrite重写跳转

    目录 Nginx的location匹配与rewrite重写跳转 一.常用的Nginx正则表达式 二.location 分类 location常用的匹配规则 优先级 location示例说明 Rewri ...

  2. Nginx中的location规则与rewrite重写(详解)

    内容预知 1.Nginx中location与rewrite 1.1 location与rewrite常用的正则表达式 1.2  location与rewrite的联系和区别 2.location的匹配 ...

  3. Nginx rewrite ——重写跳转

    目录 一.Nginx常见模块 二.常用的Nginx正则表达式 三.local概述 3.1 local分类 3.2 local 常用的匹配规则 3.3 local 优先级 3.4 location 示例 ...

  4. Web服务之Nginx浅析

    一.Nginx 简介: nginx [engine x]是Igor Sysoev编写的一个高性能的HTTP和反向代理服务器,另外它也可以作为邮件代理服务器. 在大多数情况下都是用来做静态web服务器和 ...

  5. 综合架构web服务之nginx详解

    文章目录 nginx 服务配置详细介绍 关于作者 前言 一.nginx web 入门简介 1.1 什么是nginx 1.2 常见的网站服务 1.3 nginx 网站服务特点 1.4 网站页面访问原理 ...

  6. nginx作为web服务以及nginx.conf详解

    Nginx系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1.nginx简介 nginx是一个优秀的web服务程序.反向代理程序.它采用非 ...

  7. Web服务器之Nginx介绍

    一.Nginx简介 Nginx (engine x) 是一个高性能的Web和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服器.Nginx处理高并发能力是十分强大的,能经受高负载的考 ...

  8. Nginx正则表达式与location匹配简介

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.nginx rewrite概述 1.概述 2. 跳转场景​ 3. 跳转实现 4. rewrite实际场景 二.nginx ...

  9. Linux运维web运维 结合rewirte和location来进行匹配和网页重写跳转

    文章目录 前言 一.nginx的常用正则表达式 二.location 1 location分类 2 匹配的选项 3 location 优先级 4 匹配规则 三 rewrite 跳转实现 执行顺序 fl ...

最新文章

  1. grape动态PHP结构(三)——API接口
  2. [Android学习笔记]使用ListView
  3. C#实现简体繁体转换代码示例
  4. Mac上搭建Go语言环境及第一个hello.go程序
  5. centos怎么启动linux系统时间,查看Centos系统最近一次启动时间和运行时间
  6. 3. PSR-3 --- 日志接口
  7. python背景怎么自定义铃声_【Python成长之路】如何用2行代码将抖音视频设置成我的手机铃声...
  8. MAC-终端命令大全
  9. linux数据库能看到系统执行了哪些命令,Linux-Mysql常用命令(上)
  10. 金融数据分析(十三)投资组合问题
  11. 一份硬核计算机科学CS自学计划
  12. 易车网李斌:一个放牛娃的梦想(转载)
  13. Android studio安卓虚拟机无法启动
  14. mysql 统计请假天数_sql查询员工请假详情——请假天数跨月问题
  15. 中国智能传感器投资规划建议及前景方向预测报告2022年版
  16. niit考试题库计算机英语翻译,NIIT SM2-MT1模拟试题 HELP KEY
  17. 算法:分治策略和递归1 | 通过迭代来学习递归
  18. STM8L051F3单片机竟然没有TIM1定时器,却有TIM2,3,4!!!害我调了一天没调出来
  19. Python 爬虫下一代网络请求库 httpx 和 parsel 解析库测评
  20. 【C语言】C语言成长之路之关于C语言的操作符以及一些表达式的讲解(՞• •՞).

热门文章

  1. labview插件下载
  2. 为什么要写博客,写博客有什么意义
  3. fixed:error:0308010C:digital envelope routines::unsupported
  4. 进军亚纳米时代!FinFET之后,摩尔定律如何延续
  5. 文本话题聚类(Kmeans/LDA)
  6. MySQL5.7自带分词搜索使用
  7. Oracle批量插入UUID数据
  8. 大连云计算产业为10万中小企业建起“云平台”
  9. Java语言每日一练—第14天:银行收入计算
  10. 《学会提问》读书笔记——第二章