Developer Guide

サーバーサイド連携ガイド

WordPress以外の自作サイト(PHP / Node.js / Next.js)に、AIが読める形で店舗情報を埋め込み、中央更新で常に最新に保つための導入キットです。制作会社さま向け。組み込みは1か所だけ。

連携キットをダウンロード(.zip) nurevo-server-integration.zip — PHP / Node.js / Next.js の実コード+robots.txt+手順書

なぜ「サーバー側」でないとダメか

これを理解しないと、入れても効きません。

AIクローラー(GPTBot / ClaudeBot / PerplexityBot 等)は JavaScriptを実行しません。ブラウザで後から挿入するタグ(<script src="…/tag.js"> や GTM経由)で入れた構造化データは、AIからは見えません。

そこで本キットは、サーバーがHTMLを生成する時点で JSON-LD を埋め込みます。ブラウザの「ページのソースを表示(view-source)」に application/ld+json が出る=AIが読める状態になります。

⚠️ 重要

クライアント側の tag.js(1行JSタグ)は設置確認には使えますが、AEO目的では無効です。必ず本キット(サーバー側)を使ってください。

仕組み — 常に最新になる理由

店のサーバー ──(描画のたび / 10分キャッシュ)──▶  Nurevo  /api/tag/config?k=サイトキー
      │                                                 │
      │   ◀────────── ruleset反映済みの JSON-LD ─────────┘
      ▼
生HTMLの <head> に <script type="application/ld+json"> を埋めて返す

Nurevo中央の「脳(ruleset)」が更新されると、各サイトは次回取得時(最大10分)に自動で最新化。API障害時は直近キャッシュを使うので、店のページは絶対に壊れません(フェイルオープン)。

導入手順

  1. サイトキーを用意
    Nurevoダッシュボードでサイトを登録し、発行された nrv_xxxxxxxx を控える。
  2. 環境に合わせて組み込む(下記)
  3. robots.txt を置く(AIクローラー許可)
  4. 検証する(view-source に application/ld+json が出るか確認)

PHP 素のPHP / 多くのCMS

同梱の php/nurevo-aeo.php をサーバーに置き、各ページの <head> 内・</head> の直前で呼ぶ:

<?php require __DIR__ . '/nurevo-aeo.php'; nurevo_render_jsonld('nrv_xxxxxxxx'); ?>

Node.js Express 等

同梱の node/nurevo-aeo.js を置き:

const { nurevoJsonLdTag } = require('./nurevo-aeo');
app.get('/', async (req, res) => {
  const ld = await nurevoJsonLdTag('nrv_xxxxxxxx');
  res.send(`<!doctype html><html><head>${ld}</head><body>...</body></html>`);
});

テンプレートエンジン派は nurevoMiddleware('nrv_xxxxxxxx') を使い、ビューで res.locals.nurevoJsonLd を <head> に出力。

Next.js App Router

同梱の nextjs/nurevo.ts を lib/ 等に置き、app/layout.tsx(Server Component)で:

import { getNurevoJsonLd } from '@/lib/nurevo';
const ld = await getNurevoJsonLd('nrv_xxxxxxxx');
// <head> 内で:
{ld && <script type="application/ld+json"
   dangerouslySetInnerHTML={{__html: JSON.stringify(ld).replace(/</g,'\\u003c')}} />}

robots.txt 全環境共通

同梱の static/robots.txt をドメイン直下に配置(既存があれば User-agent ブロックを追記)。

CDN(Cloudflare等)側で「AIボットをブロック」が入っていると、robots.txtで許可してもエッジで止まります。CDN設定も必ず確認してください。

検証 — 組み込み後、必ず確認

これが通れば「AIに読まれる状態」になっています。

① ソースに出ているか(最重要)

ブラウザで店のページを開き「ページのソースを表示」→ application/ld+json を検索。JSON-LDが生HTMLに出ていればOK(DevToolsのElementsで見えるだけ=JS注入はNG)。

② コマンドで確認

# 生HTMLにJSON-LDが含まれるか
curl -s https://あなたの店.jp/ | grep -o 'application/ld+json' | head

# AIボットのふりをしても返るか(エッジブロックの検出)
curl -s -A "GPTBot" https://あなたの店.jp/ | grep -o 'application/ld+json' | head

どちらも1行返れば合格。①で出て②で出ない場合はCDNがAIボットを弾いています。

方式の比較

方式AIが読める常に最新用途
WordPressプラグイン○○WordPressサイト
本キット(サーバー側連携)○○自作サイト(本ページ)
ホスト型ページ /s/○○サイトを持たない店(GBPに紐付け)
tag.js(1行JSタグ)×○設置確認のみ(AEO無効)
静的JSON-LD手貼り○×更新しない固定情報

よくある質問

キャッシュ10分だと「常に最新」じゃないのでは?
中央更新は最大10分で全サイトに反映されます。毎リクエストでAPIを叩くと遅く・重くなるための設計です。cacheTtl で短縮も可能。
tag.js(1行JSタグ)を貼ってはダメ?
設置確認(稼働検知)には使えますが、AEO目的(AIに読ませる)では無効です。必ず本キット(サーバー側)を使ってください。
APIが落ちたらページは?
直近キャッシュを使い、無ければJSON-LDを出さないだけ。店のページ本体は一切壊れません(フェイルオープン)。
エンドポイントの仕様は?
GET https://nurevo.jp/api/tag/config?k=<siteKey> → { "ok": true, "jsonld": {…}, "crawlerAllowed": bool }。本キットは cfg.jsonld をそのまま <script type="application/ld+json"> に出力します。