首页  /  Web 应用服务  /  正文

Nginx 伪静态 URLRewrite 配置

Web 应用服务 2026-10-01📖 14 分钟👁 —
🌐 Web 应用服务 · Nginx第 6 / 8 页12345678📖 完整导航 →

一、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= 为参数查询:

翻页测试页面,当前停在第 2 页

先添加 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 网关实现原理(网关服务器)

我没有同一内网的两台服务器,仅用视频中的操作演示效果。

视频的运行模式是:

101 是反向代理/负载均衡器,104 是应用服务器

其中 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:写内网最好,这就要求两台机器在同一内网(同一云厂商)

直接访问 104 的 8080 已经超时了

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

101 代理到 104,外网无法访问、内网可以访问

网关服务器配置 URLRewrite

视频演示的原配置:

location 里 rewrite 到 index.jsp 再 proxy_pass 到 104

假设想要配置负载均衡,在原来的基础配置 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)/ {
    }
}
网关服务器示意图,101 是大门