Linux基础命令之Nginx中的rewrite功能(重新)

一、什么是Rewrite

        Rewrite也称URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他URL的过程。

        1. URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。比如http://www.123.com/news/index.php?id=123 使用URLRewrite 转换后可以显示为 http://www.123.com/news/123.html

        2. 从安全角度上讲,如果在url中暴露太多的参数,无疑会造成一定量的信息泄漏,可能会被一些黑客利用,对你的系统造成一定的破坏,所以静态化的url地址可以给我们带来更高的安全性。

        3. 实现网站地址跳转、盗链。

二、Rewrite相关指令

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

        1、if指令

        if 的语法 if (condition) { … }

        应用于server和location环境内(if 与条件之间必须有空格)

        if 可以支持如下条件判断匹配符号

        ~ 为区分大小写匹配

        ~* 为不区分大小写匹配

        !~和!~* 分别为区分大小写不匹配及不区分大小写不匹配

        -f 和!-f 用来判断是否存在文件

        -d 和!-d 用来判断是否存在目录

        -e 和!-e 用来判断是否存在文件或目录

        -x 和!-x 用来判断文件是否可执行

        在匹配过程中可以引用一些Nginx的全局变量,更多的变量请参考         http://wiki.nginx.org/NginxHttpCoreModule 的 Variables 部分

        $args 请求中的参数;

        $document_root 针对当前请求的根路径设置值;

        $host 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;

        $limit_rate 对连接速率的限制;

        $request_method 请求的方法,比如"GET"、"POST"等;

        $remote_addr 客户端地址;

        $remote_port 客户端端口号;

        $remote_user 客户端用户名,认证用;

        $request_filename 当前请求的文件路径名(带root指定的路径,即网站的主目录)

        $request_uri 当前请求的文件路径名(不带root指定的路径)

        $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 请求到达的服务器端口号;

        last stops processing the current set of ngx_http_rewrite_module directives and starts a search for a new location matching the changed URI; 相当于Apache里的[L]标记,表示完成rewrite

        break stops processing the current set of ngx_http_rewrite_module directives as with the break directive; 本条规则匹配完成后,终止匹配,不再匹配后面的规则

        redirect returns a temporary redirect with the 302 code; used if a replacement string does not start with “http://” or “https://”; 返回302临时重定向,浏览器地址会显示跳转后的URL地址

        permanent returns a permanent redirect with the 301 code.返回301永久重定向,浏览器地址会显示跳转后URL地址

rewrite /(.*)\.php$ /$1.html break;

(.*)任意字符长度

.php$ 以php结尾

$1引用前边的(.*)

任意请求php结尾的网页转到html网页 然后跳出

if ( !-f $request_filename) {  如果请求的文件不存在则执行以下操作

rewrite ^/(.*)$ /test.html last; 任意不存在的网页请求装给test.html网页 last 继续替换

}

2、使用rewrite命令实现防盗链

1.盗链(html)

[root@server3 ~]# vim /var/www/html/index.html
<a href="http://192.168.50.103/aa.txt">nginx</a>

2.防盗链nginx

[root@server3 ~]# ​vim /usr/local/nginx/conf/nginx.conf
#添加如下此 Nginx 配置片段用于防止未经授权的站点直接链接到 .txt 文件。只有当请求的 referer 来自 www.robin.com、没有 referer 头、或 referer 头被阻塞时,请求才会被认为是有效的。否则,请求将被重定向到一个指定的错误页面(http://192.168.10.100/gun.html),或者如果取消注释 return 404; 行,则返回 404 错误
location ~* \.(txt)$ {                                #使用正则表达式匹配所有以 .txt 结尾的请求。~* 表示不区分大小写的匹配valid_referers none blocked www.robin.com;    #定义哪些 referer 是有效的,没有referer valid_referer=1if ($invalid_referer) {rewrite ^/ http://192.168.50.103/gun.html;#return 404;}}

none 代表没有referer

blocked 代表有referer但是被防火墙或者是代理给去除了

none the“Referer” field is missing in the request header; (即直接在客户端浏览器地址栏中输入的)

blocked the“Referer” field is present in the request header, but its value has been deleted by a firewall or proxy server; such values are strings that do not start with “http://” or “https://”;

server_names the “Referer” request header field contains one of the server names;

arbitrary string defines a server name and an optional URI prefix. A server name can have an “*” at the beginning or end. During the checking, the server’s port in the “Referer” field is ignored;

regular expression the first symbol should be a “~”. It should be noted that an expression will be matched against the text starting after the “http://” or “https://”

rewrite 指令根据表达式来重定向URI,或者修改字符串。可以应用于server,location, if环境下

每行rewrite指令最后跟一个flag标记,支持的flag标记有:

last 相当于Apache里的[L]标记,表示完成rewrite,然后继续匹配后续规则

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

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

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

redirect 和 permanent区别则是返回的不同方式的重定向,对于客户端来说一般状态下是没有区别的。而对于搜索引擎,相对来说301的重定向更加友好,

如果我们把一个地址采用301跳转方式跳转的话,搜索引擎会把老地址的相关信息带到新地址,同时在搜索引擎索引库中彻底废弃掉原先的老地址。使用302重定向时,搜索引擎(特别是google)有时会查看跳转前后哪个网址更直观,然后决定显示哪个,如果它觉的跳转前的URL更好的话,也许地址栏不会更改,那么很有可能出现URL劫持的现像。

参考示例:
例1:
http://www.test.com/test/abc/1.html ⇒ http://www.test.com/ccc/bbb/2.html
location /test{rewrite .* /ccc/bbb/2.html permanent;
}
例2:
http://www.test.com/2015/12/10/2.html ==> http://www.test.com/2014/12/10/2.html
location /2015 {rewrite ^/2015/(.*)$ /2014/$1 permanent; #引用
}
例3:
http://www.test.com/2015/ccc/bbb/2.html ==> http://jd.com/index.php
location /2015{if ($host ~* www.test.com) {rewrite .* http://www.jd.com/index.php permanent;}
}
例4:
#http://www.test.com/kkk/1.html ==> http://jd.com/kkk/1.html
location / {
root html;
index index.html index.htm;
if ($host ~* www.test.com) {rewrite .* http://www.jd.com/$request_uri permanent;}
}
例5:
有时候在访问一个二级子目录时会出现目录后的/无法补齐,如:
[root@localhost html]# elinks --dump www.test.com/www/xxx 无法访问
[root@localhost html]# elinks --dump www.test.com/www/可以访问
if ( -d $request_filename) {rewrite ^(.*)([^/])$ http://$host$1$2/ permanent;
}
^/(.*)([^/])$表示以/符号开始并紧跟着任何字符,同时不是以/为结束的字符串,在我的url中,(.*)表示的www,([^/])表示的不是以/结束的字符串
例6:
#http://www.test.com/login/robin.html ==> http://www.test.com/reg/login.php?user=robin
location /login {rewrite ^/login/(.*)\.html$ /reg/login.php?user=$1 permanent;
}
例7:
http://www.test.com/uplook/2000-12-20.html ==> http://www.test.com/uplook/2000/11/20.html
location /uplook {rewrite ^/uplook/([0-9]+)-([0-9]+)-([0-9]+)\.html$ /uplook/$1/$2/$3.html permanent
}
set 指令是用于定义一个变量,并且赋值。应用于server,location,if环境。
例8:
#http://robin.test.com ==> http://www.test.com/robin
#http://zorro.test.com ==> http://www.test.com/zorro
[root@root html]# mkdir robin zorro
[root@root html]# echo robin.... > robin/index.html
[root@root html]# echo zorro... > zorro/index.html
a. DNS实现泛解析
*.test.com IN A 网站IP
b. nginx Rewrite
if ($host ~* "^www.test.com$" ) {break;
}
if ($host ~* "^(.*)\.test\.com$" ) {set $user $1;rewrite .* http://www.test.com/$user permanent;
}
return 指令用于返回状态码给客户端,应用于server,location,if环境。
例9:如果访问的.sh结尾的文件则返回403操作拒绝错误
location ~* \.sh$ {return 403;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/68192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RK3568平台开发系列讲解(ConfigFS篇)ConfigFS核心数据结构

🚀返回专栏总目录 文章目录 一、数据结构二、结构体关系三、案例3.1、configfs_subsystem 实例3.2、config_group 实例化四、属性和方法五、config_item实例化沉淀、分享、成长,让自己和他人都能有所收获!😄 理解 ConfigFS 的核心数据结构对于深入使用和定制 ConfigFS 非…

微信小程序案例1——制作猫眼电影底部标签导航栏

文章目录 一、项目步骤1 新建一个无AppID的movie项目2将准备好的底部标签导航图标拷贝到movie项目下面(将图标文件夹image放到项目文件夹里&#xff09;3 打开App.json配置文件&#xff0c;在pages数组里添加4个页面路径:电影“pages/movie/movie”、影院“pages/cinema/cinema…

CSS 伪类(Pseudo-classes)的详细介绍

CSS 伪类详解与示例 在日常的前端开发中&#xff0c;CSS 伪类可以帮助我们非常精准地选择元素或其特定状态&#xff0c;从而达到丰富页面表现的目的。本文将详细介绍以下伪类的使用&#xff1a; 表单相关伪类 :checked、:disabled、:enabled、:in-range、:invalid、:optional、…

Elasticsearch 开放推理 API 增加了 Azure AI Studio 支持

作者&#xff1a;来自 Elastic Mark Hoy Elasticsearch 开放推理 API 现已支持 Azure AI Studio。在此博客中了解如何将 Azure AI Studio 功能与 Elasticsearch 结合使用。 作为我们持续致力于为 Microsoft Azure 开发人员提供他们选择的工具的一部分&#xff0c;我们很高兴地宣…

JUC学习笔记02

文章目录 JUC笔记2练习题&#xff1a;手写线程池代码解释&#xff1a;AdvancedThreadPool 类&#xff1a;WorkerThread 内部类&#xff1a;AdvancedThreadPoolExample 类&#xff1a; 线程池的思考CPU密集型IO密集型 练习题&#xff1a;手写自动重试机练习题&#xff1a;手写定…

baigeiRSA

baigeiRSA 打开附件有两个&#xff1a; 1.import libnumfrom Crypto.Util import numberfrom secret import flag​size 128e 65537p number.getPrime(size)q number.getPrime(size)n p*q​m libnum.s2n(flag)c pow(m, e, n)​print(n %d % n)print(c %d % c)​​2.n…

【csp-j学习完C++语法后,如何进阶学习C++算法和数据结构?】

在掌握了 CSP - J 的 C 语法基础后&#xff0c;接下来的进阶学习需要系统地掌握各类算法和数据结构知识&#xff0c;并通过大量练习来巩固和提高应用能力。以下是一份详细的进阶学习规划&#xff1a; 第一阶段&#xff1a;基础算法学习&#xff08;1 - 2 个月&#xff09; 排…

QT中解决使用QCustomplot绘制高速大量数据时频谱图卡顿问题

[&#xff01;&#xff01;&#xff01;核心方法&#xff01;&#xff01;&#xff01;] 使用带参数的replot()函数绘制m_pCustomPlot>replot(QCustomPlot::rpQueuedReplot) 1. replot() 方法 void QCustomPlot::replot(QCustomPlot::RefreshPriority refreshPriority rp…

【AI】卷积神经网络CNN

不定期更新&#xff0c;建议关注收藏点赞。 目录 零碎小组件经验总结早期的CNN 零碎小组件 全连接神经网络 目前已经被替代。 每个神经元都有参与&#xff0c;但由于数据中的特征点变化大&#xff0c;全连接神经网络把所有数据特征都学习了&#xff0c;故效果不好。感受野&…

微信小程序~电器维修系统小程序

博主介绍&#xff1a;✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

LLAMA-Factory安装教程(解决报错cannot allocate memory in static TLS block的问题)

步骤一&#xff1a; 下载基础镜像 # 配置docker DNS vi /etc/docker/daemon.json # daemon.json文件中 { "insecure-registries": ["https://swr.cn-east-317.qdrgznjszx.com"], "registry-mirrors": ["https://docker.mirrors.ustc.edu.c…

Java高频面试之SE-18

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; BIO NIO AIO的区别&#xff1f; 在 Java 网络编程中&#xff0c;BIO、NIO 和 AIO 是三种不同的 I/O 模型&#xff0c;它们的核心区别在于 阻塞…

蓝桥杯刷题DAY3:Horner 法则 前缀和+差分数组 贪心

所谓刷题&#xff0c;最重要的就是细心 &#x1f4cc; 题目描述 在 X 进制 中&#xff0c;每一数位的进制不固定。例如&#xff1a; 最低位 采用 2 进制&#xff0c;第二位 采用 10 进制&#xff0c;第三位 采用 8 进制&#xff0c; 则 X 进制数 321 的十进制值为&#xff…

BUU24 [GXYCTF2019]BabyUpload 1

开局上传文件 上传muma.php 上传.htaccess文件也被打回 再次求助互联网&#xff0c;才发现这提示给的多么明显&#xff0c;上传.htaccess文件是检查文件类型&#xff08;Contnet-Type&#xff09;&#xff0c;上传muma.php是检查后缀里头有没有ph &#xff0c;检查文件类型那…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(三)

文章目录 使用CLI管理RabbitMQrabbitmqctlrabbitmq-queuesrabbitmq-diagnosticsrabbitmq-pluginsrabbitmq-streamsrabbitmq-upgraderabbitmqadmin 使用CLI管理RabbitMQ RabbitMQ CLI 工具需要安装兼容的 Erlang/OTP版本。 这些工具假定系统区域设置为 UTF-8&#xff08;例如en…

3.攻防世界 weak_auth

题目描述提示 是一个登录界面&#xff0c;需要密码登录 进入题目页面如下 弱口令密码爆破 用1 or 1 #试试 提示用admin登录 则尝试 用户名admin密码&#xff1a;123456 直接得到flag 常用弱口令密码&#xff08;可复制&#xff09; 用户名 admin admin-- admin or -- admin…

优化深度神经网络

训练集、开发集(验证集)、测试集 偏差与方差 正则化 L2正则 Dropout 随机丢弃部分神经元输入&#xff0c;经常用于计算机视觉的神经网络内&#xff0c;因为通常没有足够的训练数据&#xff0c;很容易出现过拟合的问题 数据增强 训练集规一化 可以使其图像更均匀&#xff0c;…

【玩转 Postman 接口测试与开发2_018】第14章:利用 Postman 初探 API 安全测试

《API Testing and Development with Postman》最新第二版封面 文章目录 第十四章 API 安全测试1 OWASP API 安全清单1.1 相关背景1.2 OWASP API 安全清单1.3 认证与授权1.4 破防的对象级授权&#xff08;Broken object-level authorization&#xff09;1.5 破防的属性级授权&a…

Spring @PropertySource:让你的应用配置更加模块化和可维护

PropertySource注解在Spring中的作用&#xff0c;就像是给Spring应用配了一个“外部配置箱”。 想象一下&#xff0c;你在开发一个Spring应用时&#xff0c;有很多配置信息需要设置&#xff0c;比如数据库的连接信息、应用的某些功能开关等。如果这些信息都硬编码在代码中&…

RK3576——USB3.2 OTG无法识别到USB设备

问题&#xff1a;使用硬盘接入到OTG接口无热插拔信息&#xff0c;接入DP显示屏无法正常识别到显示设备&#xff0c;但是能通过RKDdevTool工具烧录系统。 问题分析&#xff1a;由于热插拔功能实现是靠HUSB311芯片完成的&#xff0c;因此需要先确保HUSB311芯片驱动正常工作。 1. …