> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rev.iq/llms.txt
> Use this file to discover all available pages before exploring further.

# ウェブマスター

> サイトでのデマンド承認方法を学びましょう！

export const domain = (() => {
  const placeholder = "your-domain.com";
  if (typeof window !== "undefined" && !globalThis.__revDomainSetup) {
    globalThis.__revDomainSetup = true;
    function textNodes(node) {
      if (node.nodeType === Node.TEXT_NODE) return [node];
      const nodes = [];
      for (const child of node.childNodes) {
        nodes.push(...textNodes(child));
      }
      return nodes;
    }
    function anchorNodes(node) {
      if (node.nodeType === Node.ELEMENT_NODE && node.tagName === "A") return [node];
      const nodes = [];
      for (const child of node.childNodes) {
        nodes.push(...anchorNodes(child));
      }
      return nodes;
    }
    const domain = globalThis.__revDomain || new URLSearchParams(globalThis.location.search).get('domain') || "yourdomain.com";
    globalThis.__revDomain = domain;
    if (globalThis.__revDomainObs) return;
    const obs = globalThis.__revDomainObs || new MutationObserver(mutations => {
      for (const {addedNodes, removedNodes, target} of mutations) {
        for (const node of [...addedNodes, target]) {
          if (node instanceof HTMLScriptElement) continue;
          if (node instanceof HTMLStyleElement) continue;
          for (const textNode of textNodes(node)) {
            if (textNode.nodeValue && textNode.nodeValue.includes(placeholder)) {
              setTimeout(() => {
                textNode.nodeValue = textNode.nodeValue.replace(placeholder, domain);
              }, 100);
            }
          }
          for (const anchorNode of anchorNodes(node)) {
            if (anchorNode.href && anchorNode.href.includes(placeholder)) {
              setTimeout(() => {
                anchorNode.href = anchorNode.href.replace(placeholder, domain);
              }, 100);
            }
          }
        }
      }
    });
    obs.observe(document.body, {
      childList: true,
      subtree: true
    });
  }
  return placeholder;
})();

export const CloudflareFields = ({fields}) => {
  const CopyButton = ({value}) => {
    return <button onClick={e => {
      navigator.clipboard.writeText(value);
      e.target.innerText = "✅";
      setTimeout(() => e.target.innerText = "📋", 2000);
    }}>
        {"📋"}
      </button>;
  };
  const CloudflareField = ({label, value, copy, ...rest}) => <div {...rest}>
      <sub style={{
    bottom: 0
  }}>{label}</sub>
      <br />
      <div style={{
    padding: "10px",
    border: "1px solid #88888888",
    borderRadius: "5px",
    marginBottom: "10px",
    display: "flex",
    justifyContent: "space-between"
  }}>
        <strong>{value}</strong> {copy && <CopyButton value={value} />}
      </div>
    </div>;
  return <div style={{
    display: "flex",
    gap: "0.5rem"
  }}>
      {fields.map(({flex, ...rest}) => <CloudflareField {...rest} style={{
    flex: flex ?? "1"
  }} />)}
    </div>;
};

export const Text = ({text}) => text;

## ads.txtの更新

RevIQのデマンドをサイトで実行するには、ads.txt（認定デジタル販売者）にセラーを追加する必要があります。

TL;DR - **your-domain.com/ads.txt** を **rev.iq/your-domain.com/ads.txt** にリダイレクト（302）するか、
ホストされたファイルの内容を手動で追加してください。

### リダイレクトを使用する方法

ads.txtファイルへのリダイレクトを使用することをお勧めします。これにより、RevIQが新しいデマンドパートナーを
追加するたびにファイルが自動的に更新されます。

<Note>
  既存のads.txt行がある場合、ホストされたファイルに追加できます。RevIQの技術担当者（こんにちは ;D）が
  オンボーディング時にこれらをインポートしている可能性がありますが、既存のads.txtがホストされたファイルに
  含まれていない場合は、お問い合わせください。
</Note>

<Warning>
  302（一時的）リダイレクトの使用をお勧めします。将来的にリダイレクトを簡単に更新または削除できるためです。
</Warning>

<AccordionGroup>
  <Accordion icon="cloudflare" title="Cloudflare">
    1. [Cloudflareダッシュボード](https://dash.cloudflare.com)にログインし、
       アカウントとドメインを選択します。

    2. **Rules > Redirect Rules** に移動します。

    3. **Single Redirects** の下で、**Create Redirect Rule** を選択します。

    4. **Rule name** にルールのわかりやすい名前を入力します。<br />
       例: `Redirect to RevIQ ads.txt`

    5. **When incoming requests match** の下で、**Custom filter expression** を定義します:

    <div style={{marginInlineStart: "2rem", }}>
      <CloudflareFields
        fields={[
     { label: "フィールド", value: "URI Path" },
     { label: "演算子", value: "Equals" },
     { label: "値", value: "/ads.txt", flex: 4, copy: true },
  ]}
      />
    </div>

    6. **Then** の下で、ルール式に一致するリクエストのURLリダイレクト設定を定義します: <br />

    <div style={{marginInlineStart: "2rem", }}>
      <CloudflareFields
        fields={[
     { label: "タイプ", value: "Static" },
     { label: "URL", value: "https://rev.iq/" + "your-domain.com" + "/ads.txt", flex: 4, copy: true },
     { label: "ステータスコード", value: "302" },
  ]}
      />
    </div>

    7. ルールを保存してデプロイするには、**Deploy** を選択します。ルールをデプロイする
       準備ができていない場合は、**Save as Draft** を選択します。
  </Accordion>

  <Accordion icon="feather" title="Apache">
    `.htaccess` ファイルに以下の行を追加します:

    <pre><code>Redirect 302 /ads.txt <Text text={`https://rev.iq/your-domain.com/ads.txt`} /></code></pre>
  </Accordion>

  <Accordion icon="hexagon" title="Nginx">
    `nginx.conf` ファイルに以下の行を追加します:

    ```nginx nginx.conf theme={null}
    location = /ads.txt {
        return 302 https://rev.iq/your-domain.com/ads.txt;
    }
    ```
  </Accordion>
</AccordionGroup>

### 手動設定

ホストされたファイルの行を自分の `ads.txt` ファイルに手動で追加することもできます。

<Warning>
  手動で行う場合、新しいデマンドパートナーが追加されるたびに `ads.txt` ファイルを手動で更新する必要があります。
</Warning>

<AccordionGroup>
  <Accordion icon="file" title="ファイル">
    [https://rev.iq/your-domain.com/ads.txt](https://rev.iq/your-domain.com/ads.txt)
    のホストされたファイルから行をコピーし、自分の `ads.txt` ファイルに追加します。
  </Accordion>

  <Accordion icon="wordpress" title="Wordpress - Advanced Ads">
    1. [WordPressダッシュボード](https://wordpress.com/home)で **Advanced Ads > Settings** に移動します。

    2. **ads.txt** までスクロールし、
       [https://rev.iq/your-domain.com/ads.txt](https://rev.iq/your-domain.com/ads.txt)
       のホストされたファイルから行を貼り付けます。
  </Accordion>
</AccordionGroup>

## ads.txtの確認

ads.txtが正しく設定されていることを確認するには、
[https://your-domain.com/ads.txt](https://your-domain.com/ads.txt) にアクセスしてください。
