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,一经查实,立即删除!

相关文章

anaconda使用

anaconda配置镜像源&#xff1a; 引用&#xff1a;https://zhuanlan.zhihu.com/p/17776864328 # 显示所有的镜像源 conda config --show channels # 设置镜像源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add c…

DeepSeek 阐述 2025年前端发展趋势

预测2025年前端的发展趋势。首先&#xff0c;我需要考虑当前的前端 技术发展情况&#xff0c;以及近几年的变化趋势。比如&#xff0c;框架方面&#xff0c;React、Vue、Angular这些主流框架的更新方向和社区活跃度。可能用户想知道未来哪些技术会更流行&#xff0c;或者需要学…

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

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

【实战篇】巧用 DeepSeek,让 Excel 数据处理更高效

一、为何选择用 DeepSeek 处理 Excel 在日常工作与生活里,Excel 是我们频繁使用的工具。不管是统计公司销售数据、分析学生成绩,还是梳理个人财务状况,Excel 凭借其强大的功能,如数据排序、筛选和简单公式计算,为我们提供了诸多便利。但当面对复杂的数据处理任务,比如从…

微信小程序案例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、…

docker多个容器的相互通信

在同一台宿主机上运行多个 Docker 容器时&#xff0c;容器之间可以通过以下几种方式实现通信&#xff1a; 1. 使用 Docker 默认网络&#xff08;Bridge 网络&#xff09; Docker 默认会为每个容器分配一个 bridge 网络&#xff0c;容器可以通过 IP 地址或容器名称互相通信。 …

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

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

基于Bootstrap + Java + Oracle实现的电商平台

以下是基于Bootstrap Java Oracle实现的电商平台开发方案&#xff08;简化版&#xff09;&#xff1a; 一、系统架构设计 前端&#xff1a;Bootstrap 5 jQuery 后端&#xff1a;Java Spring Boot 数据库&#xff1a;Oracle 19c 自动化&#xff1a;Spring Scheduler Oracle…

JUC学习笔记02

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

【Unity】从父对象中获取子对象组件的方式

1.GetComponentInChildren 用于获取对与指定组件或游戏对象的任何子级相同的游戏对象上的组件类型的引用。 该方法在Unity脚本API的声明格式为&#xff1a; public T GetComponentInChildren(bool includeInactive false) includeInactive参数&#xff08;可选&#xff09…

Redis性能优化

1.是否使用复杂度过高的命令 首先&#xff0c;第一步&#xff0c;你需要去查看一下 Redis 的慢日志&#xff08;slowlog&#xff09;。 Redis 提供了慢日志命令的统计功能&#xff0c;它记录了有哪些命令在执行时耗时比较久。 查看 Redis 慢日志之前&#xff0c;你需要设置慢…

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;故效果不好。感受野&…

YOLOv11-ultralytics-8.3.67部分代码阅读笔记-downloads.py

downloads.py ultralytics\utils\downloads.py 目录 downloads.py 1.所需的库和模块 2.def is_url(url, checkFalse): 3.def delete_dsstore(path, files_to_delete(".DS_Store", "__MACOSX")): 4.def zip_directory(directory, compressTrue, ex…

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

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

VDN 微服务架构搭建篇(三)基于 Nacos 的 Spring Cloud Gateway 动态路由管理

VDN 微服务架构搭建篇&#xff08;三&#xff09;&#xff1a;基于 Nacos 的 Spring Cloud Gateway 动态路由管理 在微服务架构中&#xff0c;网关 是整个系统的入口&#xff0c;负责 流量管理、请求路由、安全控制等关键功能。 Spring Cloud Gateway 作为 Spring 生态官方推荐…

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…