如果你的网站是用 Vue.js 或 React 构建的单页应用(SPA),域名防红的策略与传统的多页面网站有很大不同。SPA 的内容是通过前端 JavaScript 动态渲染的,这与传统 PHP 网站的服务端渲染完全不同,这给安全检测爬虫的识别带来了特殊挑战。无相盾团队在这篇文章中分享 SPA 防红的实战策略。
SPA 的防红难点
问题一:爬虫看到的是空壳
传统的 SPA 在服务端返回的 HTML 只是一个空壳——真正的内容是通过 JavaScript 在浏览器中渲染的。一些简单的爬虫可能只抓取到这个空壳 HTML,根本看不到你的营销内容,这种情况下反而不容易被标红。
但问题是:Google Safe Browsing 的爬虫具备 JavaScript 渲染能力。它可以像真实浏览器一样执行 JS 并看到完整的页面内容。所以不要指望「SPA 就不会被标红」。
问题二:路由完全在前端
SPA 使用前端路由(Vue Router、React Router),URL 的变化不会触发服务器请求。这意味着你无法在服务端根据 URL 来做分流——因为所有页面请求最终都指向同一个 index.html。
问题三:API 请求暴露
SPA 的数据通常通过 API 接口获取。即使你在页面层面做了防红,API 返回的数据也可能被安全系统检测到。
SPA 防红的解决方案
方案一:SSR 预渲染 + 服务端过滤(推荐)
最彻底的方案是将 SPA 升级为 SSR(服务端渲染)或使用预渲染。
Vue.js 可以使用 Nuxt.js,React 可以使用 Next.js。在 SSR 模式下,页面在服务端渲染后返回完整的 HTML,你可以在服务端的渲染环节中加入无相盾的过滤逻辑。
这种方案的好处是:
- 可以在服务端准确判断访客身份
- 安全检测爬虫收到的是完整渲染后的安全页面 HTML
- 真实用户也能获得更好的首屏加载性能和 SEO 效果
方案二:反向代理层过滤
如果你不想改动 SPA 的代码,可以在反向代理(Nginx)层面加入过滤逻辑:
# Nginx 配置示例
server {
listen 443 ssl;
server_name yourdomain.com;
# 无相盾过滤层
location / {
# 先经过无相盾的过滤判断
set $target "spa";
# 如果是安全检测机器人,返回安全页面
if ($http_user_agent ~* "Googlebot|bingbot|SafeBrowsing") {
set $target "safe";
}
# 根据判断结果代理到不同的后端
proxy_pass http://127.0.0.1:3000/$target;
}
}
注意:上面的 Nginx 配置只是一个简化示例。实际部署中,仅靠 User-Agent 匹配是远远不够的,你需要无相盾完整的三层验证。
方案三:Cloudflare Workers
如果你使用 Cloudflare CDN,可以通过 Cloudflare Workers 在边缘节点实现过滤。Workers 可以在请求到达你的源站之前进行 Bot 检测,并根据结果返回不同的内容。
Vue.js 项目的具体实施
以 Vue 3 + Vite 项目为例:
如果使用 Nuxt 3(推荐)
在 server/middleware/ 目录下创建防红中间件,这样所有请求都会先经过过滤层。具体的中间件代码参考本系列中的 Node.js 域名防红方案文章。
如果保持纯 SPA
纯 SPA 无法在前端做有效的防红(因为前端代码对所有人都是透明的)。你必须在服务端或反向代理层面实现过滤。最简单的方式是在托管 SPA 静态文件的服务器(Nginx、Apache)前面加一层无相盾的过滤。
React 项目的具体实施
如果使用 Next.js(推荐)
Next.js 的 middleware.ts 文件可以在边缘运行,是做防红过滤的理想位置。具体的实现方式参考前文。
如果使用 Create React App
CRA 构建的纯 SPA 同样需要在服务端层面解决。将构建产物部署到一个带有无相盾过滤层的 Node.js 或 Nginx 服务器上。
API 请求的防护
别忘了保护你的 API 接口。安全检测爬虫可能会直接请求你的 API 端点。解决方案:
- API 请求也经过无相盾的过滤层
- 使用 JWT 或 Session Token 来验证 API 请求的来源
- 对敏感 API 添加 Rate Limiting
SPA 的域名防红比传统网站更复杂,但有了正确的策略和工具,同样可以实现有效的防护。更多技术方案,欢迎访问无相盾官网。