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

如何在Next.js的Link组件中处理不以http、https开头的链接

解决方案

核心原理

Next.js 内置的 <Link> 组件默认会将没有 http/https 前缀的路径识别为站内相对路径,因此会自动拼接在当前站点域名后,这是符合组件设计逻辑的。你只需要在传入href属性前对用户提交的外部链接做一次标准化处理即可解决问题。

步骤1:编写链接标准化工具函数

你可以封装一个通用工具函数,自动为无协议的外部链接补全 https 前缀,同时过滤危险伪协议避免安全风险:

// utils/normalizeUrl.js
export function normalizeExternalUrl(url) {
  // 先去除首尾空格
  const trimmedUrl = url.trim();
  // 过滤危险伪协议,避免XSS风险
  if (trimmedUrl.startsWith('javascript:') || trimmedUrl.startsWith('data:') || trimmedUrl.startsWith('vbscript:')) {
    return '#';
  }
  // 已经带http/https协议的直接返回
  if (/^https?:\/\//i.test(trimmedUrl)) {
    return trimmedUrl;
  }
  // 没有协议的默认补全https前缀
  return `https://${trimmedUrl}`;
}

在渲染用户提交的外部链接时,先用上面的函数处理href值即可:

import Link from 'next/link';
import { normalizeExternalUrl } from '@/utils/normalizeUrl';

function UserSubmittedLink({ rawUrl, linkText }) {
  const normalizedUrl = normalizeExternalUrl(rawUrl);
  
  // 区分内外部链接,外部链接补充安全属性
  const isExternal = !normalizedUrl.startsWith(process.env.NEXT_PUBLIC_SITE_DOMAIN);
  
  return (
    <Link 
      href={normalizedUrl}
      {...(isExternal ? {
        target: '_blank',
        rel: 'noopener noreferrer'
      } : {})}
    >
      {linkText}
    </Link>
  )
}

额外说明

  • 如果你的业务场景需要兼容http协议的旧站点,可以根据需求调整补全逻辑,或者增加协议检测逻辑
  • 建议给用户提交的链接增加格式校验规则,入库前就做一次标准化处理,减少前端处理的压力
  • 如果使用的是Next.js 13+的App Router,上述逻辑完全适用,不需要额外调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:36:06