当前位置: 首页 > news >正文

NGINX_十二 nginx 地址重写 rewrite

十二 nginx 地址重写 rewrite

1 什么是Rewrite

Rewrite对称URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他URL的过程。
  • URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。比如
    http://www.123.com/news/index.php?id=123 使用URLRewrite 转换后可以显示为 http://www.123 .com/news/123.html对于追求完美主义的网站设计师,就算是网页的地址也希望看起来尽量简洁明快。
    理论上,搜索引擎更喜欢静态页面形式的网页,搜索引擎对静态页面的评分一般要高于动态页面。所以,UrlRewrite可以让我们网站的网页更容易被搜索引擎所收录。
  • 从安全角度上讲,如果在URL中暴露太多的参数,无疑会造成一定量的信息泄漏,可能会被一些黑客
    利用,对你的系统造成一定的破坏,所以静态化的URL地址可以给我们带来更高的安全性。
  • 实现网站地址跳转,例如用户访问360buy.com,将其跳转到jd.com。例如当用户访问tianyun.com的
    80端口时,将其跳转到443端口。

2 Rewrite 相关指令

  • Nginx Rewrite 相关指令有 if 、rewrite、set、return

2.1、if 语句

应用环境

server,location

语法:

if (condition) {}
if 可以支持如下条件判断匹配符号
~ 					正则匹配 (区分大小写)
~* 				    正则匹配 (不区分大小写)
!~                  正则不匹配 (区分大小写)
!~*		            正则不匹配  (不区分大小写)
-f!-f 		    用来判断是否存在文件
-d!-d 		    用来判断是否存在目录
-e!-e 		    用来判断是否存在文件或目录
-x!-x 		    用来判断文件是否可执行在匹配过程中可以引用一些Nginx的全局变量
$args				请求中的参数;
$document_root	    针对当前请求的根路径设置值;
$host				请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$limit_rate			对连接速率的限制;
$request_method		请求的方法,比如"GET""POST";
$remote_addr		客户端地址;
$remote_port		客户端端口号;
$remote_user		客户端用户名,认证用;
$request_filename   当前请求的文件路径名(带网站的主目录/usr/local/nginx/html/images/a.jpg)
$request_uri		当前请求的文件路径名(不带网站的主目录/images/a.jpg)
$query_string$args相同;
$scheme				用的协议,比如http或者是https
$server_protocol	请求的协议版本,"HTTP/1.0""HTTP/1.1";
$server_addr 		服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
$server_name		请求到达的服务器名;
$document_uri$uri一样,URI地址;
$server_port 		请求到达的服务器端口号;

2.2、Rewrite flag

rewrite 指令根据表达式来重定向URI,或者修改字符串。

​ 可以应用于server,location, if环境下每行rewrite指令最后跟一个flag标记,支持的flag标记有:

last 			    相当于Apache里的[L]标记,表示完成rewrite。默认为last。
break 				本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect 			返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent 		    返回301永久重定向,浏览器地址会显示跳转后URL地址

​ redirect 和 permanent 区别则是返回的不同方式的重定向,对于客户端来说一般状态下是没有区别的。而对于搜索引擎,相对来说301的重定向更加友好,如果我们把一个地址采用301跳转方式跳转的话,搜索引擎会把老地址的相关信息带到新地址,同时在搜索引擎索引库中彻底废弃掉原先的老地址。使用302重定向时,搜索引擎(特别是google)有时会查看跳转前后哪个网址更直观,然后决定显示哪个,如果它觉的跳转前的URL更好的话,也许地址栏不会更改,那么很有可能出现URL劫持的现像。在做URI重写时,有时会发现URI中含有相关参数,如果需要将这些参数保存下来,并且在重写过程中重新引用,可以用到 () 和 $N 的方式来解决。

2.3、Rewrite匹配参考示例

# 本地解析host文件
例1:
# http://www.testpm.com/a/1.html ==> http://www.testpm.com/b/2.htmllocation /a {root    /html;index   1.html index.htm;rewrite .* /b/2.html permanent;}location /b {root    /html;index   2.html index.htm;}
例2:
# http://www.testpm.com/2019/a/1.html ==> http://www.testpm.com/2018/a/1.htmllocation /2019/a {root    /var/www/html;index   1.html index.hml;rewrite ^/2019/(.*)$ /2018/$1 permanent;}location /2018/a {root    /var/www/html;index   1.html index.htl;}
例3:
# http://www.lanfw1.com/a/1.html ==> http://jd.comlocation /a {root    /html;if ($host ~* www.qf.com ) {rewrite .* http://jd.com permanent;}}
例4:
# http://www.lanfw1.com/a/1.html ==> http://jd.com/a/1.html
location /a {root /html;if ( $host ~* testpm.com ){rewrite .* http://jd.com$request_uri permanent;}}
例5: 在访问目录后添加/  (如果目录后已有/,则不加/)
# http://www.lanfw1.com/a/b/c
# $1: /a/b/
# $2: c
# http://$host$1$2$3/
location /a/b/c {if (-d $request_filename) {rewrite ^(.*)([^/])$ http://$host$1$2/ permanent;}}
例6:
# http://www.lanfw.com/login/lanfw.html ==>  http://www.lanfw.com/reg/login.html?user=lanfwlocation /login {root   /usr/share/nginx/html;rewrite ^/login/(.*)\.html$ http://$host/reg/login.html?user=$1;}location /reg {root /usr/share/nginx/html;index login.html;}
例7:
#http://www.lanfw.com/qf/11-22-33/1.html  ==>  http://www.lanfw.com/qf/11/22/33/1.html
location /qf {rewrite ^/qf/([0-9]+)-([0-9]+)-([0-9]+)(.*)$ /qf/$1/$2/$3$4 permanent;}location /qf/11/22/33 {root /html;index   1.html;}

2.4、set 指令

set 指令是用于定义一个变量,并且赋值

应用环境:

server,location,if

应用示例

例8:
#http://alice.testpm.com ==> http://www.testpm.com/alice
#http://jack.testpm.com ==> http://www.testpm.com/jack[root@nginx-server conf.d]# cd /usr/share/nginx/html/
[root@nginx-server html]# mkdir jack alice
[root@nginx-server html]# echo "jack.." >> jack/index.html
[root@nginx-server html]# echo "alice.." >> alice/index.htmla. DNS实现泛解析
*   		IN      A			    网站IP
# 或者本地解析域名host文件
10.0.105.202 www.testpm.com
10.0.105.202 alice.testpm.com
10.0.105.202 jack.testpm.com# 编辑配置文件:
server {listen       80;server_name  www.testpm.com;location / {root   /usr/share/nginx/html;index  index.html index.htm;if ( $host ~* ^www.testpm.com$) {break;}if ( $host ~* "^(.*)\.testpm\.com$" ) {set $user $1;rewrite .* http://www.testpm.com/$user permanent;}}location /jack {root /usr/share/nginx/html;index  index.html index.hml;}location /alice {root /usr/share/nginx/html;index index.html index.hml;}
}

2.5、return 指令

return 指令用于返回状态码给客户端

server,location,if

应用示例:

例9:如果访问的.sh结尾的文件则返回403操作拒绝错误
server {listen       80;server_name  www.testpm.cn;#access_log  /var/log/nginx/http_access.log  main;location / {root   /usr/share/nginx/html;index  index.html index.htm;}location ~* \.sh$ {return 403;}
}
例10:
<==80 == 443 == 80转443端口 ==> 
server {listen       80;server_name  www.testpm.cn;access_log  /var/log/nginx/http_access.log  main;return 301 https://www.testpm.cn$request_uri;
}server {listen 443 ssl;server_name www.testpm.cn;access_log  /var/log/nginx/https_access.log  main;#ssl on;ssl_certificate   /etc/nginx/cert/2447549_www.testpm.cn.pem;ssl_certificate_key  /etc/nginx/cert/2447549_www.testpm.cn.key;ssl_session_timeout 5m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;ssl_prefer_server_ciphers on;location / {root  /usr/share/nginx/html;index index.html index.htm;}
}[root@nginx-server ~]# curl -I http://www.testpm.cn
HTTP/1.1 301 Moved Permanently
Server: nginx/1.16.0
Date: Wed, 03 Jul 2019 13:52:30 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://www.testpm.cn/

3 last break详解

d17a4709c5bfc4e1cc4c8fa2d6ee005a2435d49f

[root@localhost test]# cat /etc/nginx/conf.d/last_break.conf 
server {listen       80;server_name  localhost;access_log  /var/log/nginx/last.access.log  main;location / {root   /usr/share/nginx/html;index  index.html index.htm;}location /break/ {root /usr/share/nginx/html;rewrite .* /test/break.html break;}location /last/ {root /usr/share/nginx/html;rewrite .* /test/last.html last;}location /test/ {root /usr/share/nginx/html;rewrite .* /test/test.html break;}}
[root@localhost conf.d]# cd /usr/share/nginx/html/
[root@localhost html]# mkdir test
[root@localhost html]# echo "last" > test/last.html
[root@localhost html]# echo "break" > test/break.html
[root@localhost html]# echo "test" > test/test.htmlhttp://10.0.105.196/break/break.html
http://10.0.105.196/last/last.html

注意:

  • last 标记在本条 rewrite 规则执行完后,会对其所在的 server { … } 标签重新发起请求;
  • break 标记则在本条规则匹配完成后,停止匹配,不再做后续的匹配;
  • 使用 alias 指令时,必须使用 last;
  • 使用 proxy_pass 指令时,则必须使用break。

4 Nginx 的 https ( rewrite )

server {listen       80;server_name  *.vip9999.top vip9999.top;if ($host ~* "^www.vip9999.top$|^vip9999.top$" ) {return 301 https://www.vip9999.top$request_uri;}if ($host ~* "^(.*).vip9999.top$" ) {set $user $1;return 301 https://www.vip9999.top/$user;}}# Settings for a TLS enabled server.server {listen       443 ssl;server_name  www.vip9999.top;location / {root      /usr/share/nginx/html;index     index.php index.html;}#pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000location ~ \.php$ {root           /usr/share/nginx/html;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;include        fastcgi_params;}ssl on;ssl_certificate cert/214025315060640.pem;ssl_certificate_key cert/214025315060640.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout  10m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;}

5 Apache 的 https ( rewrite )

[root@localhost ~]# yum -y install httpd mod_ssl
[root@localhost ~]# vim /etc/httpd/conf.d/vip9999.conf

1561898727918

例4

image-20240619201432502

相关文章:

NGINX_十二 nginx 地址重写 rewrite

十二 nginx 地址重写 rewrite 1 什么是Rewrite Rewrite对称URL Rewrite&#xff0c;即URL重写&#xff0c;就是把传入Web的请求重定向到其他URL的过程。URL Rewrite最常见的应用是URL伪静态化&#xff0c;是将动态页面显示为静态页面方式的一种技术。比如 http://www.123.com…...

react用ECharts实现组织架构图

找到ECharts中路径图。 然后开始爆改。 <div id{org- name} style{{ width: 100%, height: 650, display: flex, justifyContent: center }}></div> // data的数据格式 interface ChartData {name: string;value: number;children: ChartData[]; } const treeDep…...

坚持刷题|合并有序链表

文章目录 题目思考代码实现迭代递归 扩展实现k个有序链表合并方法一方法二 PriorityQueue基本操作Java示例注意事项 Hello&#xff0c;大家好&#xff0c;我是阿月。坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;消失了一段时间&#xff0c;我又回来刷题啦&#xff0c;今天…...

SPI协议——对外部SPI Flash操作

目录 1. W25Q32JVSSIQ背景知识 1.1 64个可擦除块 1.2 1024个扇区&#xff08;每个块有16个扇区&#xff09; 1.3 页 1. W25Q32JVSSIQ背景知识 W25Q32JV阵列被组织成16,384个可编程页&#xff0c;每页有256字节。一次最多可以编程256个字节。页面可分为16组(4KB扇区清除&…...

kotlin类型检测与类型转换

一、is与!is操作符 1、使用 is 操作符或其否定形式 !is 在运行时检测对象是否符合给定类型。 fun main() {var a "1"if(a is String) {println("a是字符串类型:${a.length}")}// 或val b a is Stringprintln(b) } 二、"不安全的"转换操作符…...

【JDBC】Oracle数据库连接问题记录

Failed to load driver class oracle.jdbc.driver.OracleDriver in either of HikariConfig class oracle驱动包未正确加载&#xff0c;可以先尝试使用下面方式加载检查类是否存在&#xff0c;如果不存在需要手动下载odbc包 try {Class.forName("oracle.jdbc.driver.Ora…...

leetcode45 跳跃游戏II

题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1]…...

【数学】什么是方法矩估计?和最大似然估计是什么关系?

背景 方法矩估计&#xff08;Method of Moments Estimation&#xff09;和最大似然估计&#xff08;Maximum Likelihood Estimation, MLE&#xff09;是两种常用的参数估计方法。方法矩估计基于样本矩与总体矩的关系&#xff0c;通过样本数据计算样本矩来估计总体参数。最大似…...

C++初学者指南第一步---10.内存(基础)

C初学者指南第一步—10.内存&#xff08;基础&#xff09; 文章目录 C初学者指南第一步---10.内存&#xff08;基础&#xff09;1.内存模型1.1 纸上谈兵&#xff1a;C的抽象内存模型1.2 实践&#xff1a;内存的实际处理 2. 自动存储3.动态存储&#xff1a;std::vector3.1 动态内…...

扩散模型详细推导过程——编码与解码

符号表 符号含义 x ( i ) z 0 ( i ) \boldsymbol{x}^{(i)}\boldsymbol{z}_0^{(i)} x(i)z0(i)​第 i i i个训练数据&#xff0c;其为长度为 d d d的向量 z t ( i ) \boldsymbol{z}_t^{(i)} zt(i)​第 i i i个训练数据在第 t t t时刻的加噪版本 ϵ t ( i ) \boldsymbol{\epsilo…...

js如何实现开屏弹窗

开屏弹窗是什么&#xff0c;其实就是第一次登录后进入页面给你的一种公告提示&#xff0c;此后再回到当前这个页面时弹窗是不会再出现的。也就是说这个弹窗只会出现一次。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>…...

C#——文件读取Directory类详情

文件读取Directory类 Durectory提供了目录以及子目录进行创建移动和列举操作方法 Directory和Directorylnfo类(主要操作文件目录属性列如文件是否隐藏的 或者只读等这些属性) Directory对目录进行复制、移动、重命名、创建和删除等操作DirectoryInfo用于对目录属性执行操作 …...

Ruby on Rails Post项目设置网站初始界面

在构建了Ruby的Web服务器后&#xff0c;第三步就可以去掉框架的官方页面&#xff0c;设置自己的网页初始页了。 Linux系统安装Ruby语言-CSDN博客 、在Ubuntu中创建Ruby on Rails项目并搭建数据库-CSDN博客、 Ruby语言建立Web服务器-CSDN博客 了解Ruby onRails项目中的主要文件…...

03-QTWebEngine中使用qtvirtualkeyboard

qt提供了 virtualKeyboard 虚拟键盘模块&#xff0c;只需要在在main函数中最开始加入这样一句就可以了 qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); 但是在使用的时候遇到了一些问题&#xff1a; 1、中文输入的时候没有输入提示 Qvirt…...

leetcode3无重复字符的最长字串(重点讲滑动窗口)

本文主要讲解无重复字符的最长字串的要点与细节&#xff0c;根据步骤一步步走更方便理解 c与java代码如下&#xff0c;末尾 具体要点&#xff1a; 1. 区分一下子串和子序列 子串&#xff1a;要求元素在母串中是连续地出现 子序列&#xff1a;不要求连续 2. 题目中有两个核心…...

Gobject tutorial 八

The GObject base class Object memory management Gobject的内存管理相关的API很复杂&#xff0c;但其目标是提供一个基于引用计数的灵活的内存管理模式。 下面我们来介绍一下&#xff0c;与管理引用计数相关的函数。 Reference Count 函数g_object_ref和g_object_unref的…...

DDMA信号处理以及数据处理的流程---cfar检测

Hello,大家好,我是Xiaojie,好久不见,欢迎大家能够和Xiaojie一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程,本系列文章将从目标生成、信号仿真、测距、测速、cfar检测、测角、目标聚类、目标跟踪这几个模块逐步介绍,这个系列的…...

【机器学习】从理论到实践:决策树算法在机器学习中的应用与实现

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f4d5;引言 ⛓决策树的基本原理 1. 决策树的结构 2. 信息增益 熵的计算公式 信息增益的计算公式 3. 基尼指数 4. 决策树的构建 &#x1f916;决策树的代码实现 1. 数据准备 2. 决策树模型训练 3.…...

Zookeeper 集群节点故障剔除、切换、恢复原理

Zookeeper 集群节点故障剔除、切换、恢复原理 zookeeper 集群节点故障时,如何剔除节点,如果为领导节点如何处理,如何进行故障恢 复的,实现原理? 在 Zookeeper 集群中,当节点故障时,集群需要自动剔除故障节点并进行故障恢复,确保集群的高 可用性和一致性。具体来说,…...

解决帝国cms栏目管理拼音乱码的问题

帝国CMS7.5版本utf-8版网站后台增加栏目生成乱码的问题怎么解决 1、需要改一个函数&#xff0c;并且增加一个处理文件&#xff0c;方法如下&#xff1a; 修改e/class/connect.php文件&#xff0c;找到ReturnPinyinFun函数&#xff0c;如未修改文件在4533-4547行&#xff0c;将…...

Web3j区块链开发实战:Java开发者的以太坊交互指南

Web3j区块链开发实战&#xff1a;Java开发者的以太坊交互指南 【免费下载链接】web3j Lightweight Java and Android library for integration with Ethereum clients 项目地址: https://gitcode.com/gh_mirrors/we/web3j 1. 核心价值解析&#xff1a;Web3j为何成为Java…...

【LaTeX】学术论文高效排版:从零搭建初稿模板

1. 为什么你需要LaTeX论文模板&#xff1f; 第一次写学术论文时&#xff0c;我像大多数人一样打开了Word。结果光是调整格式就花了三天——页码突然跑到封面中间、参考文献编号莫名其妙重置、公式和图片永远对不齐。直到导师扔给我一个.tex文件说"用这个"&#xff0c…...

告别回调地狱:用Qt信号与槽重构你的第一个GUI应用(Qt6/C++实战)

重构GUI应用&#xff1a;Qt信号与槽的工程化实践 在传统C GUI开发中&#xff0c;我们常常陷入回调函数嵌套的泥潭——按钮点击触发事件处理函数&#xff0c;函数内部又调用其他模块&#xff0c;最终形成难以维护的"面条式代码"。Qt的信号与槽机制为这一困境提供了优雅…...

深入Linux tcpm框架:从FUSB302芯片看PD协议兼容性那些‘坑’

深入Linux tcpm框架&#xff1a;从FUSB302芯片看PD协议兼容性那些‘坑’ Type-C接口凭借其强大的供电能力和灵活的数据传输特性&#xff0c;已成为现代电子设备的标配。然而&#xff0c;在Linux系统中实现完美的PD协议兼容性&#xff0c;却是一场充满技术陷阱的冒险。本文将带您…...

Qwen3-VL-2B离线运行实测:无需联网,本地搭建视觉对话机器人

Qwen3-VL-2B离线运行实测&#xff1a;无需联网&#xff0c;本地搭建视觉对话机器人 1. 引言 在当今AI技术快速发展的时代&#xff0c;视觉语言模型(Vision-Language Model)正逐渐从云端走向本地。Qwen3-VL-2B-Instruct作为一款轻量级多模态模型&#xff0c;能够在普通电脑上实…...

三轴 MEMS 加速度传感器在工业预测性维护中的关键应用

1. 三轴MEMS加速度传感器如何成为工业设备的"听诊器" 想象一下医生用听诊器检查病人心跳的场景。三轴MEMS加速度传感器在工业领域扮演着类似的角色&#xff0c;只不过它"听诊"的对象换成了电机、风机这些设备。这个火柴盒大小的装置&#xff08;303019mm&…...

FluentEmail 模板系统完全指南:从文件、嵌入资源到多文化模板

FluentEmail 模板系统完全指南&#xff1a;从文件、嵌入资源到多文化模板 【免费下载链接】FluentEmail All in one email sender for .NET. Supports popular senders (SendGrid, MailGun, etc) and Razor templates. 项目地址: https://gitcode.com/gh_mirrors/fl/FluentEm…...

微信小程序集成通义千问:打造悬浮窗智能对话助手

1. 为什么要在微信小程序里集成通义千问&#xff1f; 最近两年AI对话助手火得一塌糊涂&#xff0c;但大部分应用都是独立APP或者网页版。其实对于很多轻量级场景来说&#xff0c;直接在微信小程序里集成AI助手反而更实用。想象一下&#xff0c;当你在小程序里购物遇到问题时&am…...

终极指南:掌握Starlight文档导航自定义排序的7个高级技巧

终极指南&#xff1a;掌握Starlight文档导航自定义排序的7个高级技巧 【免费下载链接】starlight &#x1f31f; Build beautiful, accessible, high-performance documentation websites with Astro 项目地址: https://gitcode.com/gh_mirrors/st/starlight Starlight是…...

memory-lancedb-pro混合检索揭秘:向量搜索+BM25如何提升AI记忆准确率300%

memory-lancedb-pro混合检索揭秘&#xff1a;向量搜索BM25如何提升AI记忆准确率300% 【免费下载链接】memory-lancedb-pro Enhanced LanceDB memory plugin for OpenClaw — Hybrid Retrieval (Vector BM25), Cross-Encoder Rerank, Multi-Scope Isolation, Management CLI …...