一、URLRewrite 伪静态配置
可隐藏后端真实服务器的地址:
比如一个目录路径 /index.jsp/page=2 伪装成 /2.html(伪静态)。
云服务器异常封禁:运营商的 NAT 可能会封禁 IP,这时候直接换热点或者飞行模式切一会即可,和 waf 封禁绕过的策略很像。
我的手机(10.142.112.248) ─┐
邻居手机(10.142.112.249) ─┼─ 运营商NAT网关 ── 公网IP(123.183.169.51) ── 互联网
路人手机(10.142.112.250) ─┘
对 test 子域名配置如下:
# /etc/nginx/sites-available/test
server {
listen 80;
server_name test.168kaguyachi.site;
root /var/www/test;
index index.html;
location / {
# 正则匹配 真实的页面 转发形式
rewrite ^$ /index.html?page=? break;
# try_files $uri $uri/ =404;
# rewrite 和 try_files 不要同时用在一个 location 里
}
location ~*^/(js|css|images)/ {
}
}
在 test 页面添加了翻页测试功能,以 page= 为参数查询:

先添加 rewrite ^/2.html$ /index.jsp?page=2 break; 静态规则。
访问 test.168kaguyachi.site/2.html 显示的就是第二页了,但是这样配置生效是需要有服务器校验的(我的文件纯 index.html 而不是 jsp 或者 php),纯静态的前端是做不到的。
视频里是在 101 服务器操作的,proxy_pass 代理请求到了后端 104 服务器。
JSP/PHP 那种(视频里的),代码在服务端运行(Nginx 转发后执行),页码是服务端代码读取 ?page=2 参数;我这种纯静态 HTML + JS,代码在浏览器端运行(Nginx 只负责把文件发过去),页码是 JS 读取地址栏 URL。
用户访问: /2.html
↓
Nginx rewrite: /2.html → /index.html?page=2(内部,对浏览器透明)
↓
返回 index.html 文件给浏览器
↓
浏览器地址栏依然是 /2.html ← 关键!
↓
JS 读取地址栏: /2.html,找不到 page=2 → 显示第1页
rewrite 把参数传给「活的后端」有用,传给「死的静态文件」没用。
配置 rewrite ^/([0-9]+).html$ /index.jsp?page=$1 break;
我确实在云服务器这样配置了,但是由于没有服务器端的校验这里是无效的配置。括起来表示的是一个整体的参数。
真实页面的 $1 表示第一个匹配的规则,如果规则多就会有 $2 $3 $4 等。
([0-9]+) 是正则捕获组不是"参数",$1 是反向引用,引用第一个捕获组匹配到的内容。
捕获组:正则里 () 包起来的部分,用于提取。
$1:第 1 个捕获组匹配到的值(这里是页码数字)。
参数:是 ?page=2 里的 page,跟 Nginx rewrite 是两个层面的东西。
我的这种情况可以改为:
rewrite ^/([0-9]+)\.html$ /index.html?page=$1 break;
配合 js 实现效果:翻页显示的是 2.html 格式。
但是直接访问 /2.html 就会 404。
直接访问走的是 Nginx,Nginx 还没配 rewrite,所以不行。
需要 js 和 nginx 共同修改才可以实现最终的效果。
访问 /100.html 显示的和 /page=100 效果相同。
如果后端是 JSP,rewrite ... break 之后,用户只能通过 /2.html 访问。直接访问 /?page=2 就绕过 rewrite 了,得看 JSP 自己处不处理这个参数。
转发规则:
break 匹配到当前一条直接返回不会向下匹配。
last 则继续匹配到最新一条的返回。
redirect 302 重定向。
permanent 301 永久重定向。
301 和 302 都会显示跳转后的 url 地址,也就是访问伪地址直接匹配到真实的地址。
临时和永久的区别只是对于网络爬虫做的区别,是给浏览器看的。
二、网关、伪静态 + 负载均衡
Nginx 网关实现原理(网关服务器)
我没有同一内网的两台服务器,仅用视频中的操作演示效果。
视频的运行模式是:

其中 Nginx 服务器的功能有点多的,作为网关的负担稍多,我们把 104 的静态全都 copy 到了 101,然后 proxy 到 104,相当于流量都过了一遍 101,然而 104 在没有资源存在的情况下,端口还是能被外网访问到(有残留的缓存资源),所以需要开启防火墙禁止外网访问(要先放行 22,不然 ssh 会断开)。
另外,云服务器最外层是有一层云安全组的,所以云服务器默认 ufw 都是关闭的状态,并且没有任放行规则:
ufw status
Status: inactive
总结,想要只让 Nginx 访问,直接开启防火墙,配置 Nginx 的放行规则:
# 1. 查看当前状态
sudo ufw status
# 2. 如果没有启用,先启用 ufw(注意:启用前确保 SSH 端口已放行)
sudo ufw allow ssh
sudo ufw --force enable
# 3. 添加规则:允许 192.168.44.101 访问 8080 端口
sudo ufw allow from 192.168.44.101 to any port 8080 proto tcp
# 4. 查看已添加的规则
sudo ufw status numbered
# 5. 重载防火墙(部分版本自动生效,也可以手动执行)
sudo ufw reload
关于 IP:写内网最好,这就要求两台机器在同一内网(同一云厂商)

现在仅能通过反向代理服务器访问了:

网关服务器配置 URLRewrite
视频演示的原配置:

假设想要配置负载均衡,在原来的基础配置 upstream:
server {
listen 80;
server_name test.168kaguyachi.site;
root /var/www/test;
index index.html;
upstream https {
server 192.168.44.102 weight=8 down;
server 192.168.44.104:8080 weight=1 backup;
}
location / {
rewrite ^/([0-9]+).html$ /index.html?page=$1 break;
# 如果不想隐藏地址直接改成redirect
proxy_pass http://https;
}
location ~*^/(js|css|images)/ {
}
}
