Nginx rewrite

url组成说明
URL组成 http://www.xu.top/download?name=docker.pdf
这个URL的格式可以分为以下⼏个部分:

  1. 协议部分:指定了访问资源的协议,这个URL使⽤了默认的协议HTTP、HTTPS。
  2. 域名部分:指定服务器的域名和顶级域名,这个URL的域名部分是www.xu.top。
  3. 路径部分:指定了服务器上要访问的资源的路径,这个URL的路径部分是/download。
  4. 查询部分:包含了向服务器请求资源时所附带的数据,以键值对的形式进⾏传递,这个URL的查询部分是
    name=docker.pdf。
    因此,这个URL的格式可以表示为:
    http://www.xu.top/download?name=docker.pdf

协议部分使⽤了默认的HTTP协议,域名部分为www.xu.top,路径部分为/download,查询部分为
name=docker.pdf。

Rewrite基本概述
rewrite 主要实现 url 地址重写, 以及重定向.

Rewrite使⽤场景
1.URL访问跳转: ⽀持开发设计, ⻚⾯跳转, 兼容性⽀持, 展示效果 www.wingsredevsecops.top/a.html 实际
www.wingsredevsecops.top/b.html
2.SEO优化: 依赖于url路径,以便⽀持搜索引擎录⼊
3.维护: 后台维护, 流量转发等
4.安全: 伪静态,真实动态⻚⾯进⾏伪装

Rewrite配置语法

Syntax: rewrite regex replacement [flag];
Default: --
Context: server, location, if
//所有请求转发⾄/pages/maintain.html
rewrite ^(.*)$ /pages/maintain.html break;

# 正则表达式

.    匹配除换⾏符以外的任意字符
? 重复0次或1次
+ 重复1次或更多次
* 代表重复零次或多次。它⽤于匹配前⾯的字符、字符集或⼦表达式零次或多次。
\d 匹配数字
^ 匹配字符串的开始
$ 匹配字符串的结尾
{n} 重复n次
{n,} 重复n此或更多次
[c] 匹配单个字符c
[a-z] 匹配a-z⼩写字⺟的任意⼀个

# 正则表达式中特殊字符
\ 转义字符
rewrite index\.php$ /pages/maintain.html break;

() ⽤于匹配括号之间的内容, 通过$1,$2调⽤
if ($http_user_agent ~ Chrome){
 rewrite ^(.*)$ /chrome/$1 break;
}

# 正则表达式终端测试⼯具
[root@Nginx ~]# yum install -y pcre-tools
[root@Nginx ~]# pcretest
PCRE version 8.32 2012-11-30
re> /(\d+)\.(\d+)\.(\d+)\.(\d+)/
data> 192.168.56.11
 0: 192.168.56.11
 1: 192
 2: 168
 3: 56
 4: 11

Rewrite标记Flag

last         停⽌rewrite检测 表示完成重写,不在对后⾯的规则进⾏匹配,重新对重写后的 URL 执⾏⼀次 URI 重写
break         停⽌rewrite检测 表示完成重写后,不再对后⾯的规则进⾏匹配,直接使⽤新的 URL 请求对应的资源
redirect           返回302临时重定向, 地址栏会显示跳转后的地址 表示发出⼀个 HTTP 重定向,即通过 301 或302 状态码将客户端重定向到新的 URL
permanent       返回301永久重定向, 地址栏会显示跳转后的地址 表示发出⼀个永久 HTTP 重定向,即通过301 状态码将客户端永久性地重定向到新的 URL

# 对⽐flag中 break 与 last
[root@Nginx ~]# cat /etc/nginx/conf.d/rewrite.conf
server {
 listen 80;
 server_name rewrite.wingsredevsecops.top;
 root /soft/code;
 location ~ ^/break{
 rewrite ^/break /testc/ break;
 }
 location ~ ^/last{
 rewrite ^/last /test/ last;
 }
 location /test/{
 default_type application/json;
 return 200 '{"status":"success"}';
 }
}

last 与 break 对⽐总结:
last会新建⽴⼀个请求, 请求域名+/test
break匹配后不会进⾏匹配, 会查找对应root站点⽬录下包含/test⽬录

# 对⽐flag中 redirect 与 permanent
[root@Nginx ~]# cat /etc/nginx/conf.d/rewrite.conf
server {
 listen 80;
 server_name rewrite.wingsredevsecops.top;
 root /soft/code;
 location ~ ^/wing {
 rewrite ^/wing https://yuque.com/egrep redirect;
 #rewrite ^/wing https://yuque.com/egrep permanent;
 }
 }

Rewrite使⽤场景

ls /soft/code/course/11/22/course_33.html
server {
 listen 80;
 server_name rewrite.wingsredevsecops.top;
 root /soft/code/;
 location / {
 rewrite ^/course-(\d+)-(\d+)-(\d+)\.html /course/$1/$2/course_$3.html break;
}
 location ~ ^/wing {
 # rewrite ^/wing https://yuque.com/egrep redirect;
 rewrite ^/wing https://yuque.com/egrep permanent;
 }
 }

rewrite.xu.top/course-11-22-33.html

第⼆种场景
if ($http_user_agent ~* Chrome){
 rewrite ^/nginx https://www.yuque.com/egrep redirect;
}

Rewrite额外补充

Rewrite 匹配优先级
1.执⾏server块的rewrite指令
2.执⾏location匹配
3.执⾏选定的location中的rewrite

Rewrite 优雅书写
server {
 listen 80;
 server_name www.wing.com wing.com;
 if ($http_host = nginx.org){
 rewrite (.*) http://www.wing.com$1;
 }
}
//改良版
server {
 listen 80;
 server_name wing.com;
 rewrite ^ http://www.wing.com$request_uri?;
}
server {
 listen 80;
 server_name www.wing.com;
}
posted @ 2025-03-14 17:32  basickill  阅读(28)  评论(0)    收藏  举报