LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

如何配置Nginx使其只对特定的URL进行爬虫分流?

admin
2026年7月2日 12:9 本文热度 106

 下面给出两套可直接复制的 Nginx 配置:

  1. 精确匹配指定 URL / 指定路由前缀才走预渲染爬虫分流;

  2. 其余页面、静态资源依旧正常返回前端静态 index.html。

核心思路

  • 先定义爬虫 UA 变量 $is_crawler;

  • 单独用 location 匹配需要预渲染的路径,爬虫命中则转发到 prerender;

  • ​不匹配的路径走原 SPA 静态逻辑,不经过预渲染服务。

完整可复制 Nginx Server 配置

nginx
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    root /data/www/your-dist;
    index index.html;
    # 匹配搜索引擎爬虫UA
    set $is_crawler 0;
    if ($http_user_agent ~* "Baiduspider|Googlebot|360Spider|SogouSpider|Bytespider|bingbot|YandexBot|DuckDuckBot|spider|bot|crawler") {
        set $is_crawler 1;
    }
    # 静态资源直接放行,不走预渲染
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|map)$ {
        expires 7d;
        try_files $uri =404;
    }
    # robots、sitemap 直接读本地文件
    location ~ /(robots.txt|sitemap.xml)$ {
        try_files $uri =404;
    }
    # ======================
    # 【只对特定URL开启爬虫预渲染分流】
    # ======================
    # 示例1:栏目列表 /list/* 全部走爬虫分流
    location ^~ /list/ {
        if ($is_crawler = 1) {
            proxy_pass http://127.0.0.1:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_connect_timeout 10s;
            proxy_read_timeout 10s;
            break;
        }
        # 普通用户访问正常SPA
        try_files $uri $uri/ /index.html;
    }
    # 示例2:文章详情 /article/* 全部走爬虫分流
    location ^~ /article/ {
        if ($is_crawler = 1) {
            proxy_pass http://127.0.0.1:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_connect_timeout 10s;
            proxy_read_timeout 10s;
            break;
        }
        try_files $uri $uri/ /index.html;
    }
    # 示例3:精确单页 /about 单独分流
    location = /about {
        if ($is_crawler = 1) {
            proxy_pass http://127.0.0.1:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_connect_timeout 10s;
            proxy_read_timeout 10s;
            break;
        }
        try_files $uri $uri/ /index.html;
    }
    # ======================
    # 其余所有页面(首页、/user、/cart等)不做预渲染分流
    # ======================
    location / {
        try_files $uri $uri/ /index.html;
    }
    # html不缓存
    location = /index.html {
        expires -1;
    }
}

匹配规则说明(按需修改路径)

1. 前缀匹配 ^~ /xxx/

匹配该路由下所有子页面,适合列表、详情动态页:
nginx
location ^~ /product/ { ... }
# 匹配 /product、/product/123、/product/list?page=2

2. 精确匹配 location = /page

只匹配单一固定 URL,不匹配子路径:
nginx
location = /news { ... }
# 仅匹配 /news,不匹配 /news/1

3. 正则匹配(多组零散路径)

如果需要同时匹配多个不连续路径,可用正则:
nginx
location ~ ^/(news|goods|case)/ {
    if ($is_crawler = 1) {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 10s;
        proxy_read_timeout 10s;
        break;
    }
    try_files $uri $uri/ /index.html;
}
上面会匹配 /news/*、/goods/*、/case/* 全部路由。

HTTPS 443 站点使用方式

直接把整套 set $is_crawler + 各个 location 分流规则复制到 listen 443 ssl 的 server 块内即可。

测试是否生效

1. 匹配分流的页面(爬虫 UA)

bash
运行
curl -A "Baiduspider" http://yourdomain.com/article/123
返回完整渲染后的动态 HTML(包含列表、正文)

2. 不参与分流的页面(爬虫 UA)

bash
运行
curl -A "Baiduspider" http://yourdomain.com/user
只返回原始 SPA 空 HTML,不会转发到 prerender 服务

3. 普通用户任意页面

bash
运行
curl -A "Mozilla/5.0" http://yourdomain.com/article/123
全部返回静态 index.html,不走预渲染

优化精简:抽离代理公共配置(减少重复代码)

在 http{} 块添加公共代理片段,所有分流 location 直接引用:
nginx
http {
    # 公共预渲染代理配置
    proxy_prerender @prerender;
    location @prerender {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 10s;
        proxy_read_timeout 10s;
    }
}
之后分流 location 简化为:
nginx
location ^~ /article/ {
    if ($is_crawler = 1) {
        return @prerender;
    }
    try_files $uri $uri/ /index.html;
}

该文章在 2026/7/2 12:09:07 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-2  粤公网安备44030602007207号