Web服务器群集——URL地址重写(Rewrite)

article/2025/9/17 4:13:09

URL地址重写(Rewrite)

  • 一、什么是URL地址重写 (Rewrite )?
  • 二、Rewrite 相关指令
  • 三、Rewrite flag
  • 四、Rewrite匹配参考示例
    • 4.1 Rewrite 案例一
    • 4.2 Rewrite 案例二
    • 4.3 Rewrite 案例三
    • 4.4 Rewrite 案例四
    • 4.5 Rewrite 案例五
    • 4.6 Rewrite 案例六
    • 4.6 Rewrite 案例七:敏感文件处理方法
  • 五、总结一下

一、什么是URL地址重写 (Rewrite )?

  • 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

在这里插入图片描述

二、Rewrite 相关指令

  • 重定向 rewrite 将用户的访问(url),更换成指定的文件
  • if 语句 应用环境:server ,location 语法:if(condition){…}
  • 条件判断
~* 正则匹配(不区分大小写)
!~ 非正则匹配(区分大小写)
!~* 非正则匹配(不去分大小写)
-f 和 !-f 用来判断是否存在文件
-d 和 !-d 用来判断是否存在目录
-e 和 !-e 用来判断是否存在文件或目录
-x 和 !-x 用来判断是否可执行
  • 全局变量
$document_root     #针对当前请求的根路径设置值
$remote_addr       #客户端地址
$request_filename  #当前请求的文件路径名(当网站的主目录)
$request_uri       #当前请求的文件路径名(不带网站的主目录)
$scheme            #用的协议,比如http或https
$server_name       #请求到达的服务器名$args              #请求中的参数
$host              #请求信息中的“Host”,如果请求中没有Host行,则等于设置的服务器名
$limit_rate
$request_method
$remote_port
$remote_user
$query_string
$server_protocol
$server_addr
$document_uri
$server_port

三、Rewrite flag

在这里插入图片描述

  • break:停止用户的当前匹配
  • last:当last出现,不会显示当前执行结果,而是让用户寻找下一个location匹配,或理解为跳过(隐藏)

四、Rewrite匹配参考示例

4.1 Rewrite 案例一

站内地址重写

#需求
当用户访问http://192.168.100.10/abc/a/1.html地址时,通过redirect重定向至http://192.168.100.10/ccc/bbb/2.html

一、还原默认站点(清空上一个实验的环境)

[root@lnmp ~]# yum remove -y nginx
[root@lnmp ~]# yum install -y nginx
[root@lnmp ~]# rm -rf /usr/share/nginx/html/*         #清理环境
[root@lnmp ~]# vim /usr/share/nginx/html/index.html   #创建主页文件
/usr/share/nginx/html/index.html                      #写入内容,证明这是默认主页文件
[root@lnmp ~]# systemctl restart nginx

在这里插入图片描述
二、配置地址重写

环境准备

[root@lnmp html]# pwd
/usr/share/nginx/html
[root@lnmp html]# mkdir -p abc/a/
[root@lnmp html]# echo abc/a/index.html > abc/a/1.html
[root@lnmp html]# mkdir /usr/share/nginx/html/ccc/bbb -p
[root@lnmp html]# vim /usr/share/nginx/html/ccc/bbb/2.html
ccc/bbb/2.html

配置地址重写

[root@lnmp ~]# vim /etc/nginx/nginx.confserver {                                           #server中进行添加location /abc {rewrite .* /ccc/bbb/2.html permanent;          #.* 任意 表示不管输入什么地址都重写至2.html
}
...
[root@lnmp ~]# systemctl restart nginx

关于permanent:permanent会将地址显示为新的URL地址(重定向之后的地址)

三、访问旧页面进行测试

不添加permanent

http://192.168.100.10/abc/a/1.html

在这里插入图片描述
添加permanent
在这里插入图片描述
301页面重定向
在这里插入图片描述

四、总结一下

  • 不添加permanent URL是老的,服务器内部转换请求,称为服务器内部转换
  • 添加permanent URL被替换,生成两次请求,服务器只转换了url,客户端重新申请

4.2 Rewrite 案例二

#需求
利用正则中的"()和\1",替换url中的一部分内容
将http://192.168.100.10/2016/a/b/c/1.html
换http://192.168.100.10/2017/a/b/c/1.html

一、注释掉上一个实验中的重定向部分

避免实验出现交叉影响

#       location /abc {
#       rewrite .* /ccc/bbb/2.html permanent;   
#}

二、配置地址重写

环境准备

[root@lnmp ~]# mkdir /usr/share/nginx/html/2017/a/b/c -p   #不用配置2016因为地址会全部重定向
[root@lnmp ~]# vim /usr/share/nginx/html/2017/a/b/c/1.html
2017/a/b/c/1.html

配置地址重写

[root@lnmp ~]# vim /etc/nginx/nginx.conf
...location /2016 {rewrite ^/2016/(.*)$ /2017/$1 permanent;           #$1 抽取前方括号内的$数据赋予2017}
...
[root@lnmp ~]# systemctl restart nginx

三、访问旧页面进行测试

http://192.168.100.10/2016/a/b/c/1.html

在这里插入图片描述
在这里插入图片描述

4.3 Rewrite 案例三

#需求
location {rewrite} 只能替换url中的目录路径
使用if(){rewrite}可以替换协议主机目录全部内容
将http://www.pakho.com
换http://jd.com

一、注释掉上一个实验的重定向部分

环境清理

#       location /2016 {
#       rewrite ^/2016/(.*)$ /2017/$1 permanent;
#       }

二、配置地址重写

...if ( $host ~* pakho.com ){               #调用host变量 以不区分大小写的方法rewrite .* http://jd.com permanent;      #执行地址重写为jd.com
...
[root@lnmp ~]# systemctl restart nginx

三、访问旧页面进行测试

C:\Windows\System32\drivers\etc\hosts            #本地域名解析
192.168.100.10 pakho.com
http://pakho.com

在这里插入图片描述

4.4 Rewrite 案例四

美化URL

#需求
在访问的url是目录时,在URL自动添加一个“/”(如果不是目录,则不加/)
(先做一个判断,是目录才加,不是目录就不加)
当用户访问网站时,输入的URL不完整
1.输入的URL是目录时,自动添加“/”
http://www.baidu.com/abc
2.输入的URL是文件时,不添加“/”
http://www.baidu.com/abc/index.html
3.输入的URL是目录,但已经添加“/”时,不添加“/”
http://www.baidu.com/abc/

一、注释掉上一个实验中的重定向部分

#       if ( $host ~* pakho.com ){
#       rewrite .* http://jd.com permanent;
#       }       

二、配置地址重写

...if ( -d $request_filename ){                        #判断用户执行的不是一个文件夹rewrite ^(.*)([^/])$ http://$host$1$2/ permanent;     #用户输入为.*  排除/}
...
[root@lnmp ~]# systemctl restart nginx 

三、访问页面进行测试

[root@lnmp html]# echo /usr/share/nginx/html/ccc/bbb/index.html > /usr/share/nginx/html/ccc/bbb/index.html  #准备网站根目录
http://192.168.100.10/ccc/bbb

会自动添加/目录
在这里插入图片描述

4.5 Rewrite 案例五

#需求
目录的表达方式发送变化
原先“-”分隔,变成了“/”目录层次
将http://www.pakho.com/kgc/11-22-33/1.html
换http://www.pakho.com/kgc/11/22/33/1.html

一、注释掉上一个实验的重定向部分

#       if ( -d $request_filename ){
#       rewrite ^(.*)([^/])$ http://$host$1$2/ permanent;
#       }

二、配置地址重写

环境准备

[root@lnmp ~]# mkdir /usr/share/nginx/html/kgc/11/22/33/ -p
[root@lnmp ~]# echo '/usr/share/nginx/html/kgc/11/22/33/1.html' > /usr/share/nginx/html/kgc/11/22/33/1.html
...location /kgc {rewrite ^/kgc/([0-9]+)-([0-9]+)-([0-9]+)(.*)$ /kgc/$1/$2/$3$4 permanent; #+ 匹配前导符0-多次}
...
[root@lnmp ~]# systemctl restart nginx

三、访问页面进行测试

http://192.168.100.10/kgc/11-22-33/1.html

在这里插入图片描述

4.6 Rewrite 案例六

#需求
引用原URL中的信息,重定向至目标的URL
http://alice.pakho.com ==> http://www.pakho.com/alice
http://jack.pakho.com ==> http://www.pakho.com/jack

一、注释掉上一个实验的重定向部分

#       location /kgc {
#       rewrite ^/kgc/([0-9]+)-([0-9]+)-([0-9]+)(.*)$ /kgc/$1/$2/$3$4 permanent;
#       }

二、配置地址重写

...if ( $host ~* "^www.pakho.com$" ){         #如下配置如果用户输入www.pakho.com也会将其赋予变量造成死循环break;                                    #设置匹配如果是以www开头则停止匹配}if ( $host ~* "^(.*)\.pakho\.com$" ){      #请求像是pakho的时候set $user $1;                     #设置变量 变量名为$user $1为已有的位置变量 将$1赋值$userrewrite .* http://www.pakho.com/$user permanent;}
...
[root@lnmp ~]# systemctl restart nginx

三、访问页面进行测试

准备目标页面

[root@lnmp ~]# mkdir /usr/share/nginx/html/{alice,jack}
[root@lnmp ~]# echo "alice" > /usr/share/nginx/html/alice/index.html
[root@lnmp ~]# echo "jack" > /usr/share/nginx/html/jack/index.html

准备客户端DNS记录

C:\Windows\System32\drivers\etc\hosts
192.168.100.10 pakho.com www.pakho.com jack.pakho.com alice.pakho.com

访问

alice.pakho.com

在这里插入图片描述

jack.pakho.com

在这里插入图片描述

4.6 Rewrite 案例七:敏感文件处理方法

#目的
如果访问服务器中的特殊文件,如:.sh结尾的文件,则返回403操作拒绝错误
[root@lnmp ~]# echo 123 > /usr/share/nginx/html/1.sh
#访问
http://192.168.100.10/1.sh

在这里插入图片描述

一、设置屏蔽

...                                        #位于server中location ~* \.sh$ {return 403;                        #return返回403#return 301 http://www.pakho.com   #或是重定向至主页}
...
[root@lnmp ~]# systemctl restart nginx

二、访问页面进行测试

http://192.168.100.10/1.sh

在这里插入图片描述
实验完成!

五、总结一下

  • 关于URL地址重写功能,实验中的步骤可能与生产环境中无差别,主要还是看客户的需求
  • 让我比较困惑的应该是全局的变量,笔记中也有记录,应重在多操作多实验

http://chatgpt.dhexx.cn/article/bckh0OAw.shtml

相关文章

UKSM KSM在Android上的表现

作为一个系统管理程序(hypervisor),Linux 有几个创新,2.6.32 内核中一个有趣的变化是 KSM(Kernel Samepage Merging) 允许这个系统管理程序通过合并内存页面来增加并发虚拟机的数量。Linux UKSM 是国人自主研发的一个 Linux 内核相…

针对低端机KSM的优化

 简介: KSM的基本概念和思想可参考如下的分析 http://blog.csdn.net/summer_liuwei/article/details/6013255 http://blog.csdn.net/haitaoliang/article/details/25003395 代码分析 一, 编译设置,初始化 1. kernel-…

Linux KSM共享内存

简介:作为一个系统管理程序(hypervisor),Linux 有几个创新,2.6.32 内核中一个有趣的变化是 KSM(Kernel Samepage Merging) 允许这个系统管理程序通过合并内存页面来增加并发虚拟机的数量。本文探索 KSM 背后的理念&am…

Linux KSM

转载:http://www.cnblogs.com/zhangzhang/archive/2012/05/23/2514336.html 简介:作为一个系统管理程序(hypervisor),Linux 有几个创新,2.6.32 内核中一个有趣的变化是 KSM(Kernel Samepage Merging) 允许…

KSM应用实践

KSM应用实践 原创 lyonger 网易游戏运维平台 2019-08-17 lyonger 18年加入网易,先后负责过多个游戏产品的运维工作,多年运维生涯。负责小游戏CI/CD、事件处理平台开发、游戏Nomad运维模式探索、gitlab平台维护等工作。主要关注Linux性能优化、DevOps、云…

linux ksm,内存页面共享-KSM

导读 本文适合有基本Linux内存管理概念的新手阅读,且本文旨在从工作流程和设计思想上介绍KSM,在涉及到源代码的地方,进行了部分删减,如果想详细了解KSM,推荐阅读源代码及源代码中的注释。 作者也是初次接触Linux内核源…

Linux内存管理 之 KSM功能介绍

目录 前言1. 概述1.1 使用 madvise 控制 KSM1.1 KSM 守护进程 sysfs 接口 2.KSM技术应用场景3. KSM技术实践3.1 查看KSM运行情况3.2 KSM设置3.3 对vm的设置 前言 KSM(Kernel Samepage Merging) 共享内存的概念在现代操作系统中很常用了,比如,一个程序启…

HTTP 401 错误 - 未授权: (Unauthorized)

http://blog.csdn.net/patronsaint/article/details/5639962 介绍 您的Web服务器认为,客户端(例如您的浏览器或我们的 CheckUpDown 机器人)发送的 HTTP 数据流是正确的,但进入网址 (URL) 资源 , 需要用户身份验证 &a…

403错误(已解决)

问题描述: 取得到图片的地址,但是显示图片无法加载 浏览器开发者模式报错403 问题解决: 图片的url部署在阿里云的oss存储仓库上,登陆阿里云发现是欠费导致的oss文件存储功能失效 补充: 403 Forbidden错误的原因和解…

Error:Request failed with status code 401

Error:Request failed with status code 401 错误示例: // 获取个人信息 export const getUserInfoAPI () > {return request({url: /v1_0/user/profile,method: GET,Headers: {Authorization: Bearer ${getToken()}}}) }正确做法 // 获取个人信息 export co…

服务器发送了 HTTP 状态代码 401: Unauthorized

根据wsdl连接生成客户端代码,调用接口报错:服务器发送了 HTTP 状态代码 401: Unauthorized。查询此错误的原因是没有访问权限,想到客户再提供接口wsdl访问连接的时候提供了用户名和密码。 解决办法: 增加此类 在接口运行前增加此…

前端401错误 解决方法:响应拦截器

目录 1.该问题出现的原因 2.处理401问题的解决方案原理 3.使用响应拦截器解决问题 1.该问题出现的原因 在前后端分离项目中,最常见的是前端点击登录后,后端返回token字符串,这个token可以看作是一个“令牌”,就比如你去酒店办理…

解密网站401错误:了解发生原因和修复方法

​  每个网站都会有不同的错误码,其中,401错误被认为是相对常见的错误码。那么,什么是网站401错误呢?在摸清了这一点之后,我们也需要学习一下如何解决它。 什么是 401 状态码? 401 状态代码是 Web 服务器发送给浏览器的 HTTP …

401 错误原因和解决方案

401.1 您未被授权查看该页 HTTP 错误 401.1 - 未经授权:访问由于 凭据无效被拒绝。 出现问题的原因: 计算机用户名ftpname帐号的密码和IIS中记录的不一致。 出现这个问题的原因就是手工到IIS中修改了用户的登录密码,从而导致计算机用户名…

401错误 解决方法:响应拦截器

关于401错误 401错误场景 1. 用户未登录,代码报401,应该回到登录页 2. 登录用户的token过期 : 怎样理解token过期? . 就是登录成功了以后,后端会返回一个token值,这个值在后续请求时带上(就像是开门钥匙), 但是,这个值一般会有有效期(具…

点到超平面的距离公式

超平面: 第一步:求出超平面的法向量 超平面上任意两点, 则向量一定垂直于该超平面的法向量。这两点满足: 两式相减: 就是向量,由此可以看出超平面的法向量就是向量 第二步:求出点到超平面的距离r 假设…

模式识别中的最优分类超平面与线性支持向量机

模式识别中的最优分类超平面与线性支持向量机 本章的内容需要你理解一下的基础知识。 模式识别部分:线性分类器基本概念、感知器 数学基础部分:拉格朗日乘子法、拉格朗日对偶问题 当然,以上的基础知识不需要你现在就看,可以在阅…

平面、超平面的法线,平行超平面的距离

1. 法线 一个平面或超平面由一个方程(不是一组方程)定义: { x ∣ a T x b } \{x\mid a^Txb\} {x∣aTxb} 其中 a a a 是一个非零的列向量,而 b b b 是一个实数。那么它的法线(垂线)向量是 a a a。 例如…

如何理解超平面?

超平面的公式 首先明确几个定义:(1) 超平面是指n维线性空间中维度为n-1的子空间。它可以把线性空间分割成不相交的两部分。比如二维空间中,一条直线是一维的,它把平面分成了两块;三维空间中,一个平面是二维的&#xf…

支持向量所在超平面方程_如何用python绘制超平面支持向量机?

一个完整的例子 import numpy as np import matplotlib.pyplot as plt def __intersect(rect, line): l = [] xmin,xmax,ymin,ymax = rect a,b,c = line assert a!=0 or b!=0 if a == 0: y = -c/b if y<=ymax and y>=ymin: l.append((xmin, y)) l.append((xmax, y)) retu…