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

Next.js非组件配置文件中如何获取当前URL或主机名?

Next.js非组件文件中获取主机名的解决方案

在Next.js里直接在非组件配置文件中访问window会报错,因为服务器端渲染阶段没有window对象。这里给你几个可行的解决办法:

  • 延迟获取,在浏览器环境执行
    把获取逻辑封装成函数,只有在确认浏览器环境(window存在)时才读取window.location.hostname。服务器端执行时不会触发这部分逻辑,也就不会报错。

    export const getCurrentUrl = () => {
      return isEmulators ? "http://localhost:3000" : (typeof window !== 'undefined' ? window.location.hostname : '')
    }
    

    之后在组件中调用这个函数即可——组件在客户端渲染时window已经存在,能正常拿到主机名。

  • 通过页面的服务端函数传递主机名
    如果你的配置逻辑最终要在页面组件中使用,可以在页面的getServerSideProps里从context.req.headers.host拿到主机名,再作为props传给页面组件,之后把这个值传入你的配置逻辑。
    页面组件示例:

    export async function getServerSideProps(context) {
      const hostname = context.req.headers.host;
      return {
        props: { hostname },
      };
    }
    
    export default function YourPage({ hostname }) {
      // 这里可以把hostname传给你的配置逻辑使用
      const currentUrl = isEmulators ? "http://localhost:3000" : hostname;
      // ...
    }
    
  • 结合环境变量兜底
    如果生产环境的主机名是固定的,可以在.env文件中配置公开环境变量(前缀NEXT_PUBLIC_),服务器端优先读环境变量,客户端再 fallback 到window:

    NEXT_PUBLIC_APP_HOSTNAME=your-production-domain.com
    

    配置文件代码:

    export const currentUrl = isEmulators 
      ? "http://localhost:3000" 
      : process.env.NEXT_PUBLIC_APP_HOSTNAME || (typeof window !== 'undefined' ? window.location.hostname : '')
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:18:16