介绍:

和apache等web服务软件一样,rewrite的组要功能是实现RUL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持

rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。

 rewrite    <regex>    <replacement>    [flag];

    关键字      正则        替代内容          flag标记

    关键字:其中关键字error_log不能改变

    正则:perl兼容正则表达式语句进行规则匹配

    替代内容:将正则匹配的内容替换成replacement

    flag标记:rewrite支持的flag标记

flag标记说明:

last  #本条规则匹配完成后,继续向下匹配新的location URI规则

break  #本条规则匹配完成即终止,不再匹配后面的任何规则

redirect  #返回302临时重定向,浏览器地址会显示跳转后的URL地址

permanent  #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变,但在服务器端访问的程序及路径发生了变化。
redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。
last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy pass指令时要使用break标记。
last标记在本条 rewrite规则执行完毕后,会对其所在的server{…}标签重新发起请求,而break标记则会在本条规则匹配完成后,终止匹配,不再匹配后面的规则

rewrite参数的标签段位置:

server,location,if

rege常用正则表达式说明:

rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到repla部分,结尾是flag标记,下面是一个简单的URL rewrite跳转的例子:
rewrite ^/(.*) http://www/dmtest1.com/$1 permanent;
在上述指令中,rewrite为固定关键字,表示开启一天rewrite匹配规则,regex部分是^/(.*),这是一个正则表达式,表示匹配所有,匹配成功后
跳转到http://www.dmtest1.com/$1。这里的$1是前面(rege)部分括号里面的内容,结尾的permanent;是永久301重定向标记,
即跳转到后面的http://www.dmtest1.com/$1地址上。
\           将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。例如,"\n"匹配一个换行符,序列"\\"和"$"则匹配"$"
^ 匹配输入字符串的起始位置,如果设置了RegExp对象的Multiline属性,^也匹配"\n"或"r"之后的位置
$ 匹配输入字符串的结束位置,如果设置了RegExp对象的Multiline属性,$也匹配"\n"或"\r"之前的位置
* 匹配前面的字符零次或多次,例如,ol*能匹配"o"及"olll",*等价于{0,}
+ 匹配前面的字符一次或多次,例如,"ol+"能匹配"ol"及"oll",但不能匹配"o",.+等价于{1,}
? 匹配前面的字符零次或一次,例如,"do(es)?"可以匹配"do"或"does"中的"do",.?等价于{0,1}
当该字符紧跟在任何一个其他限制符(*,+?,{n},{n},{n,m})的后面时,匹配模式是非贪婪模式的,非贪婪模式会尽可能少地匹配所搜索的字符串,
       而默认的贪婪模式则会尽可能多地匹配所搜索的字符串,例如,对于字符串"oooo","o+?"将匹配单个"o",而"o+"将匹配所有"o"
. 匹配除"\n"之外的任何单个字符,要匹配包括"\n"在内的任何字符,请使用像"[.\n]"这样的模式
(pattern) 匹配括号内的pattern,并可以在后面获取对应的匹配,常用$0...$9属性获取小括号中的匹配内容。要匹配圆括号字符,请使用"\("或"\)"

例子:

server {

        listen 80;

        server_name abc.com;

        rewrite ^/(.*) http://www.abc.com/$1 permanent;

}

server {

        listen 80;

        server_name www.abc.com;

        location / {

                root /data/www/www;

                index index.html index.htm;

        }

        error_log    logs/error_www.abc.com.log error;

        access_log    logs/access_www.abc.com.log    main;

}

或者

server {

        listen 80;

        server_name abc.com www.abc.com;

        if ( $host != 'www.abc.com'  ) {

                rewrite ^/(.*) http://www.abc.com/$1 permanent;

        }

        location / {

                root /data/www/www;

                index index.html index.htm;

        }

        error_log    logs/error_www.abc.com.log error;

        access_log    logs/access_www.abc.com.log    main;

}

#打开浏览器访问abc.com

#页面打开后,URL地址栏的abc.com变成了www.abc.com说明URL重写成功。

 

下面是可以用来判断的表达式:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行

下面是可以用作判断的全局变量:

参数 说明
$args 这个变量等于请求行中的参数。
$content_length 请求头中的Content-length字段。
$content_type 请求头中的Content-Type字段。
$document_root 当前请求在root指令中指定的值。
$host 请求主机头字段,否则为服务器名称。
$http_user_agent 客户端agent信息
$http_cookie 客户端cookie信息
$limit_rate 这个变量可以限制连接速率。
$request_body_file 客户端请求主体信息的临时文件名。
$request_method 客户端请求的动作,通常为GET或POST。
$remote_addr 客户端的IP地址。
$remote_port 客户端的端口。
$remote_user 已经经过Auth Basic Module验证的用户名。
$request_filename 当前请求的文件路径,由root或alias指令与URI请求生成。
$query_string 与$args相同。
$scheme HTTP方法(如http,https)。
$server_protocol 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name 服务器名称。
$server_port 请求到达服务器的端口号。
$request_uri 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri 与$uri相同。

 

nginx的rewrite功能在企业里的应用非常广泛:

1、可以调整用户浏览的URL,使其看起来更规范,合乎开发及产品人员的需求。

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

3、网站换新域名后,让旧域名的访问跳转到新域名上,例如让京东的360buy换成jd.com.

4、根据特殊变量、目录客户端的信息进行URL跳转等。

实现不同域名的跳转

server {
listen 80;
server_name blog.dmtest.com;
location / {
root html/blog;
index index.html index.htm;
}
if ( $http_host ~* "^(.*)\.dmtest\.com$) {
set $domain $1;
rewrite ^(.*) http://www.dmtest.com/$domain/dm.html break;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

nginx_rewrite的更多相关文章

  1. 2.nginx_rewrite模块

    rewrite syntax: rewrite regex replacement [flag] Default: — Context: server, location, if 如果正则表达式(re ...

  2. nginx_rewrite规则介绍

    rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向.rewrite只能放在server{},location{},if{}中,并且只能 ...

  3. add web server(nginx+apache)

    #!/bin/bash # # Web Server Install Script # Last Updated 2012.09.24 # ##### modify by WanJie 2012.09 ...

  4. add web server(nginx)

    #!/bin/bash # # Web Server Install Script # Last Updated 2012.09.24 # ##### modify by WanJie 2012.09 ...

  5. 搭建Drupal-8.5.3

    环境说明 系统版本    CentOS 6.9 x86_64 软件版本    yum安装nginx 1.10.2 yum安装php 7.2.6(当前的最新版本) yum安装mysql 5.5.60 d ...

  6. Kubernetes K8S之Ingress详解与示例

    K8S之Ingress概述与说明,并详解Ingress常用示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C ...

随机推荐

  1. LVDS DP等显示器接口简介

    LVDS 产品传输速率从几百Mbps到2Gbps.它是电流驱动的,他通过在接收端放置一个负载而得到的电压,当电流正向流动,接收端输出为1,反之为0,它的摆幅250mV-450mV. lvds 即低压差 ...

  2. 单片机stm32F103单片机晶振不起振的原因分析

    这是我在做单片机最小系统板时候碰到的问题,之前虽然也做过相似的板子,可是未曾出现过无源晶振不起振的问题.下面是我在遇到问题后的一些检查,排除问题的过程.本人小菜鸟一个,文章中如有错误和不足,还望各位大 ...

  3. spring-cloud-square开发实战(三种类型全覆盖)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 前文<五分钟搞懂spring-clou ...

  4. poj 1704 Georgia and Bob (nim)

    题意: N个棋子,位置分别是p[1]...p[N]. Georgia和Bob轮流,每人每次可选择其中一个棋子向左移动若干个位置(不能超过前一个棋子,不能超出最左边[位置1]且不能不移) Georgia ...

  5. Django 开发------django-crontab实现服务端的定时任务

    一.需求: 想实现类似 Linux 中crontab 的功能.定时执行计划任务. 二.配置: a.安装插件: # pip3 install django-crontab b.在settings.py ...

  6. SpringBoot目录文件结构总结(5)

    1.目录 src/main/java :存放java代码 src/main/resources static:存放静态文件,比如css.js.image(访问方式 http://localhost:8 ...

  7. 初试Docker-打包构建镜像

    在 docker 中,镜像的结构是以层次划分的,也就是可以在每一层上添加自己的修改,变成新的镜像. docker 两种打包方式如下: commit build docker commit 注意: do ...

  8. springboot注解之容器功能

    添加组件 @Configuration.@Bean //以swagger为例 @Configuration(proxyBeanMethods = false) @EnableSwagger2 //使用 ...

  9. mysql流程控制结构case when

    一.case 使用场景 简单函数 CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement ...

  10. myeclipse trial expired暂时解决办法

    运行以下程序,生成key: import java.io.*; public class MyEclipseGen { private static final String LL = "D ...