目录:

一、常用的Nginx 正则表达式

二、location

三、rewrite

一、常用的Nginx 正则表达式

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

从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器

二、location

location 大致可以分为三类

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

location 常用的匹配规则

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

location 优先级

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

location 示例说明

 1 (1)location = / {}
2 =为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
3 再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。
4
5 (2)location / {}
6 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
7 但若后面是正则表达式会和最长字符串优先匹配(最长匹配)
8
9 (3)location /documents/ {}
10 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
11 只有其它 location后面的正则表达式没有匹配到时,才会采用这一条
12
13 (4)location /documents/abc {}
14 匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
15 只有其它 location后面的正则表达式没有匹配到时,才会采用这一条
16
17 (5)location ^~ /images/ {}
18 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
19
20 (6)location ~* \.(gif|jpg|jpeg)$ {}
21 匹配所有以 gif、jpg或jpeg 结尾的请求
22 然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则
23
24 (7)location /images/abc {}
25 最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在
26
27 (8)location ~ /images/abc {}
28 匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条
29
30 (9)location /images/abc/1.html {}
31 匹配/images/abc/1.html 文件,如果和正则 ~ /images/abc/1.html 相比,正则优先级更高

优先级总结

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)

实际网站使用中,至少有三个匹配规则定义

 1 #第一个必选规则
2 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
3 这里是直接转发给后端应用服务器了,也可以是一个静态首页
4 location = / {
5 proxy_pass http://tomcat_server/;
6 }
7
8 #第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
9 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
10 location ^~ /static/ {
11 root /webroot/static/;
12 }
13
14 location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
15 root /webroot/res/;
16 }
17
18 #第三个规则就是通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
19 非静态文件请求就默认是动态请求
20 location / {
21 proxy_pass http://tomcat_server;
22 }

三、rewrite

  • rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向
  • rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用
例如 http://www.kgc.com/test/HTML/index.php?id=1&u=str 只对/test/HTML/index.php重写

rewrite 执行顺序如下

(1) 执行 server 块里面的 rewrite 指令。
(2) 执行 location 匹配。
(3) 执行选定的 location 中的 rewrite 指令。

语法rewrite <regex> <replacement> [flag]

 1 regex :表示正则匹配规则。
2 replacement :表示跳转后的内容。
3 flag :表示 rewrite 支持的 flag 标记。
4
5
6 ###flag标记说明###
7 last :本条规则匹配完成后,继续向下匹配新的location URI规则,一般用在 server 和 if 中。
8 break :本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中。
9 redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。
10 permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

rewrite 基于域名的跳转

 1 现在公司旧域名www.kgc.com有业务需求变更,需要使用新域名www.benet.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
2 vim /usr/local/nginx/conf/nginx.conf
3 server {
4 listen 80;
5 server_name www.kgc.com; #域名修改
6 charset utf-8;
7 access_log /var/log/nginx/www.kgc.com-access.log; #日志修改
8 location / {
9 #添加域名重定向
10 if ($host = 'www.kgc.com'){ #$host为rewrite全局变量,代表请求主机头字段或主机名
11 rewrite ^/(.*)$ http://www.benet.com/$1 permanent; #$1为正则匹配的内容,即域名后边的字符串
12 }
13 root html;
14 index index.html index.htm;
15 }
16 }
17
18
19 echo "192.168.80.10 www.kgc.com www.benet.com" >> /etc/hosts
20 systemctl restart nginx
21 浏览器输入模拟访问 http://www.kgc.com/test/1.html(虽然这个请求内容是不存在的)
22 会跳转到www.benet.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。

基于客户端 IP 访问跳转

 1 今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.116.60访问正常。
2 vim /usr/local/nginx/conf/nginx.conf
3 server {
4 listen 80;
5 server_name www.kgc.com; #域名修改
6 charset utf-8;
7 access_log /var/log/nginx/www.kgc.com-access.log; #日志修改
8
9 #设置是否合法的IP标记
10 set $rewrite true; #设置变量$rewrite,变量值为boole值true
11 #判断是否为合法IP
12 if ($remote_addr = "192.168.116.60"){ #当客户端IP为192.168.80.10时,将变量值设为false,不进行重写
13 set $rewrite false;
14 }
15 #除了合法IP,其它都是非法IP,进行重写跳转维护页面
16 if ($rewrite = true){ #当变量值为true时,进行重写
17 rewrite (.+) /weihu.html; #重写在访问IP后边插入/weihu.html,例如192.168.116.60/weihu.html
18 }
19 location = /weihu.html {
20 root /var/www/html; #网页返回/var/www/html/weihu.html的内容
21 }
22
23 location / {
24 root html;
25 index index.html index.htm;
26 }
27 }
28
29
30 mkdir -p /var/www/html/
31 echo "<h1>We are maintaining now!</h1>" > /var/www/html/weihu.html
32 systemctl restart nginx
33 只有 IP 为 192.168.116.60 能正常访问,其它地址都是维护页面
如果rewrite (.+) /weihu.html;改成rewrite (.+) /weihu.html permanent; 的话,如果是非192.168.80.10的主机访问会使浏览器修改请求访问的URL成http://www.kgc.com/weihu.html再请求访问,

这样就会进入一直在rewrite的死循环,访问请求会一直被重写成http://www.kgc.com/weihu.html再请求访问

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

 1 现在访问的是 http://bbs.kgc.com/post/,现在需要将这个域名下面的访问都跳转到http://www.kgc.com/bbs/post
2 vim /usr/local/nginx/conf/nginx.conf
3 server {
4 listen 80;
5 server_name bbs.kgc.com; #域名修改
6 charset utf-8;
7 access_log /var/log/nginx/www.kgc.com-access.log;
8 #添加
9 location /post {
10 rewrite (.+) http://www.kgc.com/bbs$1 permanent; #这里的$1为位置变量,代表/post
11 }
12
13 location / {
14 root html;
15 index index.html index.htm;
16 }
17 }
18
19
20 mkdir -p /usr/local/nginx/html/bbs/post
21 echo "this is 1.html" >> /usr/local/nginx/html/bbs/post/2.html
22 echo "192.168.80.11 bbs.kgc.com" >> /etc/hosts
23 systemctl restart nginx
24 使用浏览器访问 http://bbs.kgc.com/ post/1.html 跳转到 http://www.kgc.com/bbs/post/1.html

基于参数匹配的跳转

 1 现在访问http://www.kgc.com/100-(100|200)-100.html 跳转到http://www.kgc.com页面。
2 vim /usr/local/nginx/conf/nginx.conf
3 server {
4 listen 80;
5 server_name www.kgc.com; #域名修改
6 charset utf-8;
7 access_log /var/log/nginx/www.kgc.com-access.log main;
8
9 if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
10 rewrite (.*) http://www.kgc.com permanent;
11 }
12
13 location / {
14 root html;
15 index index.html index.htm;
16 }
17 }
18
19 systemctl restart nginx
20 使用浏览器访问 http://www.kgc.com/100-200-100.html 或 http://www.kgc.com/100-100-100.html 跳转到http://www.kgc.com页面。

$request_uri: 包含请求参数的原始URI,不包含主机名,如: http://www.kgc.com/abc/bbs/index.html?a=1&b=2中的/abc/bbs/index.php?a=1&b=2
$uri:这个变量指当前的请求URI,不包括任何参数,如: /abc/bbs/index.html
$document_uri: 与$uri相同, 这个变量指当前的请求URI,不包括任何传递参数,如:/abc/bbs/index.html

  

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

 1 要求访问 http://www.kgc.com/upload/123.php 跳转到首页。
2 vim /usr/local/nginx/conf/nginx.conf
3 server {
4 listen 80;
5 server_name www.kgc.com; #域名修改
6 charset utf-8;
7 access_log /var/log/nginx/www.kgc.com-access.log main;
8
9 location ~* /upload/.*\.php$ {
10 rewrite (.+) http://www.kgc.com permanent;
11 }
12
13 location / {
14 root html;
15 index index.html index.htm;
16 }
17 }
18
19 systemctl restart nginx
20 浏览器访问 http://www.kgc.com/upload/123.php 跳转到http://www.kgc.com页面。

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

 1 要求访问一个具体的页面如 http://www.kgc.com/abc/123.html 跳转到首页
2 vim /usr/local/nginx/conf/nginx.conf
3 server {
4 listen 80;
5 server_name www.kgc.com; #域名修改
6 charset utf-8;
7 access_log /var/log/nginx/www.kgc.com-access.log main;
8
9 location ~* ^/abc/123.html {
10 rewrite (.+) http://www.kgc.com permanent;
11 }
12
13 location / {
14 root html;
15 index index.html index.htm;
16 }
17 }
18
19 systemctl restart nginx
20 浏览器访问 http://www.kgc.com/abc/123.html 跳转到http://www.kgc.com页面。

  

  

  

  

  

  

Nginx rewrite跳转 location匹配的更多相关文章

  1. Nginx - rewrite 不区分大小写进行匹配

    Nginx - rewrite 不区分大小写进行匹配 分类: Nginx2014-05-28 19:25 1046人阅读 评论(0) 收藏 举报 Use (?i) to match case-inse ...

  2. Nginx日志参数、location匹配规则、设置密码

    1.三个参数 a)$http_referer:记录此次请求是从哪个链接访问过来的: 是直接访问,还是从其他网站跳转过来的. 例如:访问:http://www.etiantian.com/,其页面首页是 ...

  3. nginx教程1:location 匹配规则

    worker_process # 表示工作进程的数量,一般设置为cpu的核数 worker_connections # 表示每个工作进程的最大连接数 server{} # 块定义了虚拟主机 liste ...

  4. Nginx中的 location 匹配和 rewrite 重写跳转

    Nginx中的location匹配和rewrite重写跳转 1.常用的Nginx正则表达式 2.location 3.rewrite 4.rewrite实例 1.常用的Nginx正则表达式: ^ :匹 ...

  5. Nginx配置请求转发location及rewrite规则

    一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这 ...

  6. Nginx使用Location匹配URL进行伪静态

    基础知识 Nginx location 配置语法 1. location [ = | ~ | ~* | ^~ ] uri { ... } 2. location @name { ... } locat ...

  7. nginx location匹配规则

    谢谢作者的分享精神,原文地址:http://www.nginx.cn/115.html location匹配命令 ~      #波浪线表示执行一个正则匹配,区分大小写~*    #表示执行一个正则匹 ...

  8. 【转】nginx location匹配规则

    转载请保留:http://www.nginx.cn/115.html location匹配命令 ~      #波浪线表示执行一个正则匹配,区分大小写~*    #表示执行一个正则匹配,不区分大小写^ ...

  9. Nginx Rewrite规则

    location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配 ...

随机推荐

  1. 数据库比对工具SQL(表、字段、触发器、索引、视图、存储过程)

    做一个数据库比对小工具,把SQL做一个笔记 SELECT object_id AS ID --表ID,'表' sType,Name --表名FROM sys.tablesORDER BY Name-- ...

  2. Java课程设计 SSM新闻资讯管理系统 博客论坛管理系统 Java编程 博客系统源代码

    注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java后台框架:SSM(Spring+SpringMVC+Mybatis)前端技术:HTML+CSS+JavaScri ...

  3. 1009 Product of Polynomials (25分) 晚上脑子就是容易僵住

    #include<iostream> using namespace std; struct { int a; double b; }poly[1001]; double a[2001]; ...

  4. 关于knn算法的总结思考

    更多的关于k近邻算法的思考 KNN(K- Nearest Neighbor)法即K最邻近法,数据挖掘分类技术中最简单的方法之一 对k近邻算法的总结: 优点部分 其可以解决分类问题,同时可以天然的解决多 ...

  5. 附件携马之CS免杀shellcode过国内主流杀软

    0x01 写在前面 其实去年已经写过类似的文章,但是久没用了,难免有些生疏.所谓温故而知新,因此再详细的记录一下,一方面可以给各位看官做个分享,另一方面等到用时也不至于出现临阵磨枪的尴尬场面. 0x0 ...

  6. 一种简易但设计全面的ID生成器思考

    分布式系统中,全局唯一 ID 的生成是一个老生常谈但是非常重要的话题.随着技术的不断成熟,大家的分布式全局唯一 ID 设计与生成方案趋向于趋势递增的 ID,这篇文章将结合我们系统中的 ID 针对实际业 ...

  7. S3C2440—4.时钟系统

    文章目录 一.S3C2440时钟体系介绍 1.总线与时钟 2.时钟来源 3.选择时钟 4.产生时钟 5.流程 二.如何配置时钟源 1.设置FCLK频率寄存器 MPLLCON 2.设置分频HDIV.PD ...

  8. redis中使用SCAN代替KEYS

    前言 由于redis的keys命令是线上禁用,所以就有了SCAN.SSCAN.HSCAN和ZSCAN四个命令. 但是这四个命令也不是每次返回全部匹配结果,因此需要一遍遍执行下去,而且每次返回的curs ...

  9. Docker运行PostgreSQL

    docker-compose.yml version: '3.1' services: db: image: postgres restart: always ports: - 5432:5432 e ...

  10. maven打jar包,导入本地jar

    本地jar包存放目录 项目目录/lib/*.jar 导入jar包配置 <resources> <!--扫描到的配置yml--> <resource> <dir ...