You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制Gatsby的navigate函数仅跳转站内客户端路由而非外部站点

限制Gatsby navigate函数仅跳转站内路由的实现方案

核心思路为封装一层自定义的安全跳转逻辑,替代原生navigate调用,跳转前先做路径合法性校验。

第一步:封装安全跳转工具函数

import { navigate as gatsbyNavigate } from "gatsby"

// 可选配置:需要放行的外部域名白名单,无需求可直接删除该配置
const ALLOWED_EXTERNAL_HOSTS = [
  // 'your-trusted-domain.com'
]

export const safeNavigate = (to, options) => {
  // 校验是否为外部链接:匹配http://、https://、协议相对路径//三种格式
  const isExternal = /^(https?:)?\/\//.test(to)
  if (isExternal) {
    const targetUrl = new URL(to, window.location.origin)
    // 不在白名单内的外部跳转直接拦截
    if (!ALLOWED_EXTERNAL_HOSTS.includes(targetUrl.host)) {
      console.warn(`已拦截非法外部跳转:${to}`)
      return
    }
  }
  // 合法路径调用原生navigate执行跳转
  return gatsbyNavigate(to, options)
}

第二步:替换项目中的navigate调用

把项目中所有直接从Gatsby导入navigate的逻辑,改为导入上述自定义的safeNavigate即可,原有调用参数完全兼容,无需调整其他业务逻辑。

可选:全局覆盖原生navigate(大项目适配方案)

如果项目体积大、逐行替换成本高,可以在gatsby-browser.js中通过全局钩子覆盖原生navigate导出:

import { navigate } from "gatsby"
import { safeNavigate } from "./src/utils/safeNavigate"

export const wrapRootElement = ({ element }) => {
  Object.assign(navigate, safeNavigate)
  return element
}

注意:全局覆盖方案在Gatsby v4、v5版本下测试有效,低版本建议优先使用显式导入自定义函数的方式,避免兼容性问题。

内容的提问来源于stack exchange,提问作者Vinoth Rajendran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 14:36:04