如何获取 twitter:image 元标记网站的基本 URL?

Posted

技术标签:

【中文标题】如何获取 twitter:image 元标记网站的基本 URL?【英文标题】:How do I get the base url of the site for twitter:image meta tag? 【发布时间】:2020-08-25 15:59:08 【问题描述】:

我在一个降价文件中有以下前题。

---
title: "Hello world!"
excerpt: "Lorem ipsum dolor sit amet"
coverImage: "/assets/blog/hello-world/cover.png"
date: "2020-03-16T05:35:07.322Z"
author:
  name: Mario
  picture: "/assets/blog/authors/mario.png"
ogImage:
  url: "/assets/blog/hello-world/cover.png"
---

我需要将图片的完整网址传递给推特卡元twitter: image 并打开图元property = "og: image"

为此,我需要获取站点的基本 url 以将其用作我通过前端获取的图像路径的前缀

<Head>
  /* Twitter */
  ...
  <meta name="twitter:image" content=data.ogImage.url />

  /* Open Graph */
  ...
  <meta property="og:url" content=`` key="ogurl" />
  <meta property="og:image" content=data.ogImage.url key="ogimage" />
</Head>

目前data.ogImage.url 的值为/assets/blog/hello-world/cover.png,但为了工作,我需要在此输出前面加上站点基本网址

如何在 nextjs 中获取站点的基本 url?

【问题讨论】:

我之前没用过nextjs但是你能用vanilla javascript吗? 这个答案***.com/a/55151122/615274帮助我明白了我需要使用副作用来获取nextjs的页面组件中window.location.href的值。 【参考方案1】:

有几种方法可以实现这样的事情:

    env 文件中创建您的基本 URL,并通过 proccess.env 引用它(This 可能有助于这种方法)

    .env 文件:

    // .env
    
    REACT_APP_BASE_URL=http://example.com/
    

    index 文件:

    <!-- index -->
    
    <meta property="og:image" content=`$process.env.BASE_URL$data.ogImage.url` key="ogimage" />
    

    使用相对路径,在这种方法中,您应该使用像这样工作的图像相对路径(this 可能会有所帮助)

    假设我们有以下结构:

    --src
      |--assets
         |--images
            |--image.png
    --index
    

    如果我们在索引文件中,我们将像这样引用该图像:

    <meta property="og:image" content=`./src/$data.ogImage.url` key="ogimage" />
                                                |__let's say this will return assets/images/image.png
    

    使用 javascript 内置方法,例如 window.location。要访问基本 URL,我们可以像这样从中获取 origin 属性:window.location.origin (对于在 next.js 中使用此方法this 可能会有所帮助)

    <meta property="og:image" content=`$window.location.origin$data.ogImage.url` key="ogimage" />
    

注意:正如 @AlexeiLevenkov 在 cmets 中提到的,因为您要求提供图像的完整路径,所以最好的方法是坚持第一种方法。

【讨论】:

请注意,由于问题询问“我需要将图像的完整 url 传递给 twitter 卡 meta twitter: image and open graph meta property = "og: image"" 只有第一个选项实际上与问题相关.这是唯一可能的选择 - 在服务器上呈现网页的代码通常不知道它将在哪个 url 上公开,因此必须传入该值。而且由于有问题的标签是针对机器人的,它们通常必须呈现在服务器上一边。【参考方案2】:

正如这个答案https://***.com/a/55151122/615274 中所解释的,在组件中使用副作用允许我访问window 对象,因此window.location.href 最终解决方案看起来与此类似

export default function Post( post, name ) 
  const  data, content  = post;
  const [origin, setOrigin] = React.useState("");

  React.useEffect(() => 
    setOrigin(window.location.origin); // <-- here I get access to window
  , []);

  return (
    <Layout title=data.title description=data.excerpt>
      <Head>
        /* Twitter */
        <meta name="twitter:image" content=`$origin$data.ogImage.url` />

        /* Open Graph */
        <meta property="og:image" content=`$origin$data.ogImage.url` key="ogimage"
        />
      </Head>

      <main>
        <PostBody data=data>content</PostBody>
      </main>
    </Layout>
  );

twitter:imageog:image的内容属性中,我可以像`$origin$data.ogImage.url`这样设置完整的url

【讨论】:

这是没有意义的,因为 Facebook bot 不会渲染页面并在这里看到一个空值。【参考方案3】:

在server side rendering 期间,您没有window,因此您无法访问location。 但是您可以在服务器端将url 前缀留空并在客户端定义它。

【讨论】:

请查看***.com/questions/50968603/… 并解释“在服务器端保留 url 前缀为空并在客户端定义它”如何在这种特殊情况下有所帮助。【参考方案4】:

以下屏幕截图说明了一切。如果您无法访问 window 对象,那么您可能正在使用它实际上无法访问的地方。您可以尝试在 标记中编写短脚本,并可以更新元值。在该脚本中,您可以访问 window 对象。

【讨论】:

请查看***.com/questions/50968603/… 并解释window 对象的图像在这种特殊情况下的帮助。【参考方案5】:

假设您可以使用普通的客户端 JavaScript(我之前没有使用过 nextjs),您可以使用 window.location.origin 访问页面的基本 url

【讨论】:

我是 nextjs 和 nodejs 的新手,组件是 nextjs 页面,在尝试 window.location.origin 时出现错误消息窗口未定义 @user615274 您的代码是否在服务器端运行(在 Node 上而不是在浏览器中)?如果是这样,我不正确,您不能使用客户端 JavaScript OP 询问了机器人使用的元标记...它们中的大多数不运行客户端页面,只查看服务器响应 - 所以window.location 在这种情况下没有用。跨度>

以上是关于如何获取 twitter:image 元标记网站的基本 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JavaScript 从元标记中获取信息?

如何从出口页面中的元标记获取标记值 - Drupal 7?

Facebook Debugger lint 工具获取 HTTP 206 - 未检测到 Open Graph 元标记(其他工具可以)

网站中的元标记

如何使用 Spring Boot 在 html 元标记中获取 csrf 令牌

如何通过 url 参数更改打开的图形元标记内容