一、Nginx Rewrite 概述
- 定义
- Nginx 的 Rewrite 模块允许对请求的 URI 进行重写操作。它可以基于一定的规则修改请求的 URL 路径,然后将请求定向到新的 URL 地址,这在很多场景下都非常有用,比如实现 URL 美化、网站重构后的 URL 跳转等。
- 主要指令
- rewrite
- 语法:
rewrite regex replacement [flag];
- 功能:按照正则表达式
regex
匹配请求的 URI,如果匹配成功,则将 URI 替换为replacement
所指定的内容。flag
是可选的标志,用于控制重写操作的行为。
- 语法:
- if
- 语法:
if (condition) {...}
- 功能:用于条件判断,根据
condition
(可以是变量、正则表达式匹配等)来决定是否执行大括号内的指令。
- 语法:
- rewrite
二、Rewrite 规则中的标志(flag)
- last
- 含义:停止处理当前的
rewrite
指令集,并重新开始在当前配置的server
块内寻找新的location
来处理请求。 - 示例:
rewrite ^/old-path/(.+)$ /new - path/$1 last;
- 应用场景:当需要将请求重定向到同一
server
内的其他location
时使用。
- 含义:停止处理当前的
- break
- 含义:停止处理当前的
rewrite
指令集,不再重新寻找location
,直接使用当前重写后的 URI 进行请求处理。 - 示例:
rewrite ^/restricted/(.+)$ /private/$1 break;
- 应用场景:在不希望重新进行
location
匹配的情况下,直接使用重写后的 URI 处理请求,比如访问受限制资源时。
- 含义:停止处理当前的
- redirect
- 含义:返回 302 临时重定向响应,告诉客户端请求的资源已临时移动到新的 URL。
- 示例:
rewrite ^/temp - move/(.*)$ http://example.com/new - temp - loc/$1 redirect;
- 应用场景:当资源临时移动到其他位置,希望客户端下次请求时能自动访问新位置时使用。
- permanent
- 含义:返回 301 永久重定向响应,告诉客户端请求的资源已永久移动到新的 URL。
- 示例:
rewrite ^/old - product/(.*)$ http://example.com/new - product - line/$1 permanent;
- 应用场景:当资源永久移动到其他位置,希望搜索引擎等客户端更新其索引时使用。
三、实验示例一
一、实验环境搭建
- 安装 Nginx
- 在 Linux 系统(如 Ubuntu)上执行以下命令安装 Nginx:
sudo apt update
sudo apt install nginx -y
- 启动 Nginx 服务:
sudo service nginx start
- 检查 Nginx 状态:
sudo service nginx status
- 在 Linux 系统(如 Ubuntu)上执行以下命令安装 Nginx:
- 配置文件位置
- Nginx 的主配置文件通常位于
/etc/nginx/nginx.conf
,但为了更好的组织配置,我们可以在/etc/nginx/conf.d/
目录下创建自定义的配置文件,例如test.conf
。
- Nginx 的主配置文件通常位于
二、实验配置
- 在
/etc/nginx/conf.d/
目录下创建并编辑test.conf
文件:sudo vi /etc/nginx/conf.d/test.conf
- 内容如下:
-
server {listen 80;server_name localhost;location / {root /var/www/html;index index.html index.htm;}# 重写规则:将以 /old/ 开头的URL重写为 /new/index.htmllocation /old/ {rewrite ^/old/(.*)$ /new/index.html permanent;}# 条件重写规则:如果请求的文件不存在,将 /search/ 开头的请求重定向到 /404.htmllocation /search/ {try_files $uri $uri/ /404.html;if ($uri ~* ^/search/(.*)$) {rewrite ^ /404.html break;}} }
-
- 创建测试文件:
- 在
/var/www/html
目录下创建以下文件:sudo mkdir -p /var/www/html/old
sudo mkdir -p /var/www/html/new
sudo touch /var/www/html/old/test.txt
sudo touch /var/www/html/new/test.html
sudo touch /var/www/html/404.html
- 在
三、实验测试
- 测试重写规则
- 在浏览器中访问
http://localhost/old/test.txt
,由于重写规则,应该会被 301 永久重定向到http://localhost/new/index.html
。
- 在浏览器中访问
- 测试条件重写规则
- 在浏览器中访问
http://localhost/search/nonexistent
,由于try_files
指令找不到请求的文件,并且满足if
条件,会直接使用/404.html
进行响应,而不会进行进一步的搜索或重定向循环。
- 在浏览器中访问
四、 实验结果图
通过这个实验,你可以更深入地理解 Nginx 的 Rewrite 功能以及如何结合try_files
和if
等指令来实现复杂的 URL 处理逻辑,同时通过具体的文件访问测试来验证配置的正确性。
四、实验示例二
一、实验环境搭建
-
安装 Nginx
- 登录到 CentOS 系统,打开终端,执行以下命令来更新系统软件包,确保系统处于最新状态:
yum update -y
- 接着安装 Nginx:
yum install nginx -y
- 启动 Nginx 服务:
systemctl start nginx
- 检查 Nginx 服务是否成功启动:
systemctl status nginx
- 如果看到类似 “active (running)” 的状态信息,说明 Nginx 已成功启动。
- 登录到 CentOS 系统,打开终端,执行以下命令来更新系统软件包,确保系统处于最新状态:
-
配置文件位置及准备
- Nginx 的主配置文件通常位于
/etc/nginx/nginx.conf
,为了便于管理本次实验相关配置,我们在/etc/nginx/conf.d/
目录下创建一个自定义配置文件,命名为rewrite_test.conf
。可以使用以下命令创建并编辑该文件:vi /etc/nginx/conf.d/rewrite_test.conf
- Nginx 的主配置文件通常位于
二、实验配置
- 在
vi
编辑器中,输入以下内容来配置rewrite_test.conf
文件(按i
键进入插入模式进行编辑,编辑完成后按Esc
键,再输入:wq
保存并退出):
server {listen 80;server_name localhost;root /usr/share/nginx/html;index index.html index.htm;# 使用last标志的重写规则location /page1/ {rewrite ^/page1/(.*)$ /newpage1/$1 last;}# 使用break标志的重写规则location /page2/ {rewrite ^/page2/(.*)$ /newpage2/$1 break;}# 使用redirect标志的重写规则location /page3/ {rewrite ^/page3/(.*)$ /newpage3/$1 redirect;}# 使用permanent标志的重写规则location /page4/ {rewrite ^/page4/(.*)$ /newpage4/$1 permanent;}
}
- 创建测试文件及目录:
- 在
/usr/share/nginx/html
目录下创建以下目录和文件,使用以下命令:- 创建目录:
mkdir -p /usr/share/nginx/html/page1
mkdir -p /usr/share/nginx/html/newpage1
mkdir -p /usr/share/nginx/html/page2
mkdir -p /usr/share/nginx/html/newpage2
mkdir -p /usr/share/nginx/html/page3
mkdir -p /usr/share/nginx/html/newpage3
mkdir -p /usr/share/nginx/html/page4
mkdir -p /usr/share/nginx/html/newpage4
- 创建目录:
- 在
- 创建测试文件及目录:
- 在
/usr/share/nginx/html
目录下创建以下目录和文件,使用以下命令:- 创建目录:
mkdir -p /usr/share/nginx/html/page1
mkdir -p /usr/share/nginx/html/newpage1
mkdir -p /usr/share/nginx/html/page2
mkdir -p /usr/share/nginx/html/newpage2
mkdir -p /usr/share/nginx/html/page3
mkdir -p /usr/share/nginx/html/newpage3
mkdir -p /usr/share/nginx/html/page4
mkdir -p /usr/share/nginx/html/newpage4
- 创建
index.html
文件并编辑内容(以page1
相关为例,其他同理):- 在
/usr/share/nginx/html/page1
目录下创建index.html
文件:vi /usr/share/nginx/html/page1/index.html
- 输入以下内容(可自行调整内容用于区分不同页面):
-
<html><body><h1>Page 1</h1></body></html>
-
- 按照同样的方式,在
/usr/share/nginx/html/newpage1
目录下创建index.html
文件,内容可设为:-
<html><body><h1>New Page 1</h1></body></html>
-
- 依次为
page2
、newpage2
、page3
、newpage3
、page4
、newpage4
等目录下创建相应的index.html
文件,并设置不同的简单内容用于区分,比如在page2
对应的index.html
中写<html><body><h1>Page 2</h1></body></html>
,在newpage2
对应的index.html
中写<html><body><h1>New Page 2</h1></body></html>
,以此类推。
- 在
- 创建目录:
- 在
三、实验测试
- 测试 last 标志
- 打开浏览器,在地址栏输入
http://localhost/page1/
,按下回车键。由于last
标志的作用,Nginx 会停止处理当前的rewrite
指令集,并重新开始在当前配置的server
块内寻找新的location
来处理请求。此时,请求会被重定向到/newpage1/
,然后 Nginx 会在/usr/share/nginx/html/newpage1
目录下查找index.html
文件,并将该文件内容返回给浏览器,你可以看到浏览器页面中显示的标题为 “New Page 1”。
- 打开浏览器,在地址栏输入
- 测试 break 标志
- 在浏览器地址栏输入
http://localhost/page2/
,回车后,因为break
标志,Nginx 会停止处理当前的rewrite
指令集,不再重新寻找location
,直接使用当前重写后的 URI(/newpage2/
)进行请求处理,接着在/usr/share/nginx/html/newpage2
目录下查找index.html
文件,并将其内容返回给浏览器,页面中会显示 “New Page 2” 字样。
- 在浏览器地址栏输入
- 测试 redirect 标志
- 访问
http://localhost/page3/
,redirect
标志会使 Nginx 返回 302 临时重定向响应,告诉客户端请求的资源已临时移动到/newpage3/
。浏览器收到这个临时重定向响应后,会自动向/newpage3/
发起新的请求,然后 Nginx 在/usr/share/nginx/html/newpage3
目录下查找index.html
文件,并将其内容返回给浏览器,此时页面显示 “New Page 3”。你还可以通过浏览器的开发者工具(一般按F12
键调出),查看网络请求的详细信息,确认返回的状态码是 302。
- 访问
- 测试 permanent 标志
- 输入
http://localhost/page4/
进行访问,permanent
标志会让 Nginx 返回 301 永久重定向响应,告知客户端请求的资源已永久移动到/newpage4/
。浏览器会更新书签以及搜索引擎索引等相关信息,下次再访问/page4/
时,就会直接请求/newpage4/
。同样,Nginx 会在/usr/share/nginx/html/newpage4
目录下查找index.html
文件并返回其内容,使浏览器页面显示 “New Page 4”。通过浏览器开发者工具查看网络请求,能确认返回的状态码为 301,并且后续再次访问http://localhost/page4/
时,浏览器会直接跳转到/newpage4/
,不再需要从/page4/
进行重定向了。
- 输入
四、实验分析
- last 标志的行为
last
标志使得 Nginx 在执行完当前重写规则后,重新进行location
匹配流程。这在实际应用中非常实用,例如当网站的页面结构调整后,某个旧路径下的页面需要重定向到新路径,且新路径对应的处理逻辑在其他location
块中有更复杂的配置时,last
标志就能确保请求按照新路径对应的location
规则进行后续处理,有助于实现灵活的页面跳转和资源分配逻辑,方便对不同路径的请求进行分类管理以及定制化响应。
- break 标志的行为
break
标志的特点是直接使用重写后的 URI 进行后续请求处理,不再进行额外的location
匹配操作。在一些特定场景下,比如当对某些特定路径的请求进行内部重写,并且重写后的资源处理逻辑已经明确固定时,使用break
标志可以避免不必要的location
查找过程,快速将请求引导到正确的资源位置,从而提高服务器的处理效率,减少资源消耗,同时也能避免因复杂的location
匹配可能导致的一些潜在冲突或错误。
- redirect 和 permanent 标志的区别
redirect
(302 临时重定向)和permanent
(301 永久重定向)这两个标志主要在对客户端和搜索引擎的影响方面存在差异。302
临时重定向意味着资源只是暂时被移动到了新的位置,客户端下次访问时可能仍然会尝试访问原来的 URL;而301
永久重定向则明确告知客户端和搜索引擎相关资源已经永久性地迁移到了新的 URL。搜索引擎收到 301 响应后,会更新其索引信息,以后搜索相关内容时就会直接指向新的 URL。在实际的网站运营中,根据页面或资源移动的性质来合理选择使用这两个标志十分重要,例如网站进行大规模重构,部分页面 URL 发生永久性变更时,使用permanent
标志有助于搜索引擎及时更新索引,提升网站在搜索结果中的排名以及用户访问的准确性;而如果只是临时进行页面维护、测试或者短期内调整页面位置等情况,则可以采用redirect
标志,避免对搜索引擎索引造成不必要的频繁变动和可能出现的混乱情况。
通过这个实验,能够清晰地观察和理解 Nginx Rewrite 规则中不同标志(flag)对处理请求的 URI 重写和重定向行为的影响,有助于在实际的 Web 服务器配置工作中,依据具体的业务需求准确选择合适的重写策略和标志,进而优化网站的 URL 结构、提升资源访问的效率以及改善用户体验和搜索引擎优化效果。同时,在实验过程中通过创建配套的测试文件和目录,并结合浏览器访问及查看开发者工具中的状态码等操作,可以更精准地验证不同标志的功能和作用,保证实验结果的可靠性和有效性。