如何阻止Google爬取__NEXT_DATA__中的类URL内容?
解决Next.js中__NEXT_DATA__被Google爬取导致404的问题
给你两个简单有效的方案,都不会触发水合错误:
方案一:给__NEXT_DATA__脚本添加
data-nosnippet属性
自定义pages/_document.js(App Router环境下是app/layout.js里的Script组件),在输出__NEXT_DATA__的脚本标签上加上data-nosnippet属性。这个属性是Google官方支持的标记,会直接告知爬虫忽略该脚本内的所有内容,完全不影响客户端水合——因为只是给脚本增加了一个标记,数据本身没有被修改。
Pages Router示例代码:import Document, { Html, Head, Main, NextScript } from 'next/document' class MyDocument extends Document { static async getInitialProps(ctx) { const initialProps = await Document.getInitialProps(ctx) return { ...initialProps } } render() { return ( <Html> <Head /> <body> <Main /> {/* 给NextScript添加data-nosnippet属性 */} <NextScript data-nosnippet /> </body> </Html> ) } } export default MyDocument方案二:从根源移除不必要的类URL字段
如果那些触发404的类URL并非客户端渲染必需的内容,直接在getStaticProps或getServerSideProps中过滤掉这些字段。比如你的数据里存在unusedUrl这类冗余字段,直接删除它,这样__NEXT_DATA__里就不会出现这些URL,自然不会被Google爬虫误判。
示例代码:export async function getStaticProps() { const data = await fetchSomeData() // 移除不必要的类URL字段 delete data.unusedUrl return { props: { data } } }
你之前用的<!--googleoff: index-->只对HTML文本内容生效,脚本内的内容爬虫依旧会解析,所以无效。而base64编码会破坏Next.js的水合机制——客户端需要原样解析__NEXT_DATA__,编码后必然会报错。上面两个方案都是官方兼容的,不会产生副作用。
内容的提问来源于stack exchange,提问作者funerr
相关产品推荐
相关产品推荐

