目录

rewrite跳转实现

rewrite 执行顺序

flag标记说明

rewrite和location区别

rewrite 示例

基于域名的跳转

基于客户端 IP 访问跳转

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

基于参数匹配的跳转

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

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


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

rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用
例如 http://www.kgc.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写。

语法格式:

rewrite <regex> <replacement> [flag];

regex :表示正则匹配规则。

replacement :表示跳转后的内容。

flag :表示rewrite支持的flag标记。

rewrite跳转实现

Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else

跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误

PCRE支持:perl兼容正则表达式的语法规则匹配

重写模块 set 指令:创建新的变量并设其值

rewrite 执行顺序

执行 server 块里面的 rewrite 指令。

执行 location 匹配。

执行选定的 location 中的 rewrite 指令。

flag标记说明

last :本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在 server 和 if 中。

break :本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中。

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

permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

rewrite和location区别

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

rewrite 示例

基于域名的跳转

现在公司旧域名www.lic.com有业务需求变更,需要使用新域名www.zhangbin.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

vim /usr/local/nginx/conf/nginx.confserver {listen       80;server_name  www.lxx.com;        #域名修改   charset utf-8;access_log  logs/www.lxx.com.access.log;      #日志修改location / {#添加域名重定向if ($host = 'www.lxx.com'){                     #$host为rewrite全局变量,代表请求主机头字段或主机名rewrite ^/(.*)$ http://www.lxxnb.com/$1 permanent;   #$1为正则匹配的内容,即“域名/”之后的字符串}root   html;index  index.html index.htm;}
}
echo "192.168.200.111 www.lxx.com www.lxxnb.com" >> /etc/hosts#创建test/1.html
cd /usr/local/nginx/html
mkdir test
echo "佛山谁最能打?当然是我啊难道叶问啊?" > test/1.htmlsystemctl restart nginx

浏览器输入模拟访问 http://www.lxx.com/test/1.html(虽然这个请求内容是不存在的)
会跳转到www.lxxnb.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而8且域名后的参数也正常跳转。

基于客户端 IP 访问跳转

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

server {listen       80;server_name  www.lxx.com;charset utf-8;access_log  logs/www.lxx.com.access.log;set $rewrite true;location ~ \.(gif|jpg|png|jepg)$ {root html;expires 1d;}if ($remote_addr = "192.168.200.111"){set $rewrite false;}if ($rewrite = true){rewrite (.+) /test/2.gif;}location = /test/2.gif{root /usr/local/nginx/html;}location / {root  html;index index.html index.htm;}

只有本机能跳转,其他机子直接跳转到2.gif界面

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

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

server {listen       80;server_name  bbs.lxx.com;charset utf-8;access_log  logs/www.lxx.com.access.log;#    location ~ \.(gif|jpg|png|jepg)$ {#      root html;#     expires 1d;#  }location /post {rewrite (.+) http://www.lxx.com/bbs$1 permanent;}location / {root  html;index index.html index.htm;}mkdir -p bbs/post
echo "肉蛋葱鸡~" >> /usr/local/nginx/html/bbs/post/1.html

使用浏览器访问 http://bbs.lxx.com/post/1.html 跳转到 http://www.lxx.com/bbs/post/1.html

基于参数匹配的跳转

现在访问http://www.lxx.com/100-(100|200)-100.html 跳转到http://www.lxx.com页面。

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.lxx.com;       #域名修改   charset utf-8;access_log  /var/log/nginx/www.lxx.com-access.log;if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {    #\d代表匹配数字,+代表匹配1个或多个rewrite (.+) http://www.lxx.com permanent;}location / {root   html;index  index.html index.htm;}
}
systemctl restart nginx$request_uri:包含请求参数的原始URI,不包含主机名,如:http://www.lxx.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

使用浏览器访问 http://www.lxx.com/100-200-100.html 或 http://www.lxx.com/100-100-100.html 跳转到http://www.lxx.com页面。#100-200只能输入100或200

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

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

  server {listen       80;server_name  bbs.lxx.com;charset utf-8;access_log  logs/www.lxx.com.access.log;#    location ~ \.(gif|jpg|png|jepg)$ {#      root html;#     expires 1d;#  }if ($request_uri ~ /upload/.*\.php$){rewrite (.+) http://www.lxx.com permanent;}location / {root  html;index index.html index.htm;}

浏览器访问 http://www.lxx.com/upload/123.php 跳转到http://www.lxx.com页面

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

要求访问一个具体的页面如 http://www.lxx.com/abc/123.html 跳转到首页

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.lxx.com;       #域名修改   charset utf-8;access_log  /var/log/nginx/www.lxx.com-access.log;location ~* ^/abc/666.html {rewrite (.+) http://www.lxx.com permanent;}location / {root   html;index  index.html index.htm;}
}systemctl restart nginx

浏览器访问 http://www.lxx.com/abc/666.html跳转到http://www.lxx.com页面。

Nginx之rewrite重写相关推荐

  1. 不带www的域名强制跳转到www域名,Nginx服务器rewrite重写

    本文以宝塔+php环境为例!在很多情况下都有要从exp.com跳转到www.exp.com的需求吧,大多时候可以在第三方域名服务商那边实现,但有的不能,就需要我们自己来实现了,下面是nginx的配置方 ...

  2. Nginx之正则表达式、location匹配简介以及rewrite重写

    目录 一.Nginx 正则表达式 二.location 匹配简介 1.匹配规则格式 ①.精准匹配 ②.一般匹配 ③.正则匹配 2.常用的匹配规则 3.匹配的优先级 4.示例 5.实际网站使用中,至少有 ...

  3. 【笔记】nginx - 上:安装、配置(基础、rewrite 重写、proxy_pass 代理、ssl)

    官网:https://nginx.org/ 官方文档: Building nginx from Sources - http://nginx.org/en/docs/configure.html 视频 ...

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

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

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

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

  6. Nginx rewrite ——重写跳转

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

  7. nginx里面的rewrite重写模块详解

    文章目录 前言 Rewrite Rewrite实用场景 Nginx正则表达式(又有正则了啊) Rewrite命令 last和break比较有什么不同? Location模块 location有哪些分类 ...

  8. Cento7+Nginx 之 URL重写

    Cento7+Nginx  之  URL重写 我们前一篇文章写了一个Cento7+Nginx 反向代理实现多域名跳转,今天主要介绍一下Cento7+Nginx  之  URL重写, Hostname: ...

  9. Nginx的rewrite应用

    Rewrite主要的功能是实现URL重写,Nginx 的 Rewrite 规则采用 PCRE Perl 兼容正则表达式的语法进行规则匹配,如相使用 Nginx 的 Rewrite 功能,在编译 Ngi ...

最新文章

  1. 使用 C++ 的 StringBuilder 提升 4350% 的性能
  2. php服务器 下载,php实现从服务器下载文件
  3. 安卓设置原生alert设置圆角_安卓手机设置充电提示音全新最全教程
  4. php设计模式课程---4、观察者模式的好处是什么
  5. 网络安全面试题及答案
  6. 【POJ 3764】 The xor-longest path
  7. tp6 使用 redis
  8. adb快速截图小脚本
  9. 茴字有几种写法?SQL排名问题之全局排名的四种解法
  10. 罗永浩被判为“老赖”最新回应:“卖艺”也要还完债,锤子科技会做下去
  11. 科研突破:非宁静无以致远
  12. ASP.NET Identity 2新增双重认证、帐号锁定、防伪印章功能并修复了一些bug
  13. Eureka源码-double check单例模式运用
  14. Hive基础之创建数据库
  15. MySQL的自身防御机制_自我防御机制
  16. 【算法题解】Codeforces Round #817 (Div. 4)题解
  17. json 大括号 转意_json字符串中的大括号转义传到后台_JSON 序列化中的转义和 Unicode 编码...
  18. 第二次作业--摩拜单车
  19. javascript实现自定义右键菜单(绑定鼠标左右键)
  20. git clone拉取过大的项目拉不下来的解决方法

热门文章

  1. DVWA之PHP文件包含漏洞(File Inclusion)
  2. 分布式环境下定时任务重复执行问题解决方案
  3. ajax 上传文件 400,AJAX上传文件
  4. $timeformat
  5. Source Insight 工程操作
  6. TCP/IP——OSPF单区域实验
  7. 2022年自考专业考试(英语)英语词汇学练习题
  8. java 本年第一个月_JAVA获取本周 本月 本年 第一天和最后一天
  9. Charles手机代理设置
  10. fiddler如何设置手机代理