İçeriğe geç
Approvalens

Okuma odası · 4 dk okuma

Cloudflare Pages ve Workers'ta ads.txt: Kurulum ve SPA Tuzağı

Cloudflare Pages veya Workers'ta ads.txt nasıl eklenir, dosya yokken neden ana sayfa 200 koduyla döner ve canlı alan adında nasıl test edilir?

Approvalens ekibi

Şu rapor bulgularını düzeltir

  • ads.txt dosyası
  • ads.txt içerik türü
  • ads.txt içindeki Google satırı
  • ads.txt yönlendirmesi
  • Google botlarının erişimi

Cloudflare Pages'te ve statik dosya sunan Workers'ta ads.txt, deploy ettiğin klasördeki sıradan bir dosya. ads.txt'yi build çıktısına koy (framework'lerin çoğunda oraya kopyalanan public/ ya da static/ klasörü), deploy et, /ads.txt adresinden sunulsun. Cloudflare'e özgü kısım, dosya bulunamadığında olan şey. Tek sayfalık uygulama (SPA) modunda Cloudflare index.html'ini 200 koduyla döndürüyor. AdSense botu satıcı listesi beklediği yerde bir HTML sayfası okuyor.

Cloudflare'de /ads.txt isteğinin karar akışı: bir Pages Function ya da run_worker_first açık bir Worker eşleşirse kod yanıt verir; yoksa eşleşen statik dosya text/plain olarak sunulur; dosya yoksa SPA modu index.html'i 200 ile, 404-page modu 404 ile döndürür
Cloudflare'in /ads.txt için ne döndüreceğine nasıl karar verdiği. Google'a gerçek bir ads.txt veren yalnızca yeşil yol.

Gereken satır

google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0

Kendi 16 haneli kimliğini pub- ile yaz (ca-pub- değil). Başka reklam ağı kullanıyorsan onların satırlarını altına ekle. Biçim kuralları ads.txt kurulumu rehberinde.

Cloudflare Pages

  1. ads.txt'yi framework'ünün build çıktısına kopyaladığı klasöre koy: Vite, Next.js, Astro ve Create React App için public/, Hugo ve SvelteKit için static/. Düz HTML sitede index.html'in yanına.
  2. Deploy et, sonra dosyanın build'e girdiğini görmek için https://projen.pages.dev/ads.txt adresini aç.
  3. Aynı yolu kendi alan adında da kontrol et.

Dosya yokken neden ana sayfa geliyor?

Cloudflare dokümanı şöyle diyor: projede en üst düzeyde bir 404.html yoksa Pages, bir tek sayfalık uygulama deploy ettiğini varsayıyor ve gelen tüm adresleri köke (/) eşliyor (Pages'in sunum davranışı).

Yani ads.txt build'e girmediyse /ads.txt 404 vermiyor, ana sayfanı 200 koduyla döndürüyor. Google, aslında olmayan bir adres için dönen gerçek bir sayfayı soft 404 sayıyor (tarama kuralları). Tarayıcıya hızlıca bakan biri de dosyanın var olduğunu sanabiliyor. İki önlem:

  • build çıktısına bir 404.html ekle, olmayan adresler gerçek 404 dönsün;
  • her deploy'dan sonra yalnızca durum koduna değil, içerik türüne ve gövdeye de bak (aşağıdaki kontroller).

Pages Functions

Eşleşen bir Function önceliklidir: Function eşleşmezse istek, varsa statik dosyaya düşüyor (Functions yönlendirmesi). functions/[[path]].js gibi her şeyi yakalayan bir Function /ads.txt'yi de yanıtlar. Build klasöründeki _routes.json ile dışarıda bırak:

{
  "version": 1,
  "include": ["/*"],
  "exclude": ["/ads.txt", "/robots.txt"]
}

Dokümana göre "exclude her zaman include'dan önce gelir", yani statik dosya sunulur.

_headers ile içerik türü

Pages her statik dosya için bir Content-Type gönderiyor. /ads.txt için tür yanlışsa build çıktısındaki bir _headers dosyasıyla değiştir. Bu dosyadaki başlıklar Cloudflare'in normalde gönderdiklerini geçersiz kılıyor (headers):

/ads.txt
  Content-Type: text/plain; charset=utf-8

www ya da kök alan adı sorunları için _redirects kullanma. Cloudflare'in kendi tablosunda "alan adı düzeyinde yönlendirme" desteklenmiyor diye işaretli (redirects).

Statik dosyalı Workers

Workers'ta dosya klasörü Wrangler yapılandırmasında tanımlanıyor ("assets": { "directory": "./public/" }). /ads.txt'nin ne döndüreceğini iki ayar belirliyor (statik dosyalar, binding seçenekleri):

Ayar /ads.txt isteğinde olan
run_worker_first false (varsayılan) ve dosya var Cloudflare dosyayı sunar. MIME türü uzantıdan belirlenir
not_found_handling = "single-page-application" ve dosya yok index.html ile "200 OK" yanıtı. Tuzak bu
not_found_handling = "404-page" ve dosya yok En yakın 404.html, 404 koduyla
run_worker_first = true Worker her istekte çalışır. /ads.txt'yi assets binding'ine devretmeli ya da kendisi yanıtlamalı

run_worker_first, ! ile dışlama içeren bir yol listesi de kabul ediyor. Böylece Worker'ı yalnızca /api/* için çalıştırıp dosyaları rahat bırakabilirsin.

Statik dosyası olmayan Worker

Worker'ının dosya klasörü yoksa yolu kodda yanıtla:

export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    if (url.pathname === "/ads.txt") {
      return new Response("google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0\n", {
        headers: { "Content-Type": "text/plain; charset=utf-8" },
      });
    }
    // …uygulamanın geri kalanı
  },
};

Özel alan adı ve kök alan adı

Google kök alan adından başlıyor: www.domain.com/ads.txt üzerindeki dosya ancak domain.com/ads.txt ona yönlendiriyorsa taranıyor (tarama kuralları). Pages'te:

  • alan adını Workers & Pages → projen → Custom domains → Set up a domain yolundan ekle. ornekblog.com gibi bir kök alan adı için siteyi Cloudflare'e zone olarak eklemen gerekiyor (özel alan adları);
  • siteyi www üzerinde yayınlıyorsan kök alan adını ona yönlendir (ya da tersini yap). Redirect Rule ya da Bulk Redirect ile nasıl yapılacağını Cloudflare'de www yönlendirme rehberinde anlattık.

AdSense'e de pages.dev ya da workers.dev adresini değil, kendi alan adını gönder.

Başka bir hosting'in önünde Cloudflare

Cloudflare yalnızca başka yerde barınan bir siteyi (WordPress, cPanel) proxy'liyorsa ads.txt o sunucuda durur ve yukarıdaki adımlar geçerli olmaz. Cloudflare yine de araya girebilir: Google botlarını engelleyen güvenlik kuralları ya da bot doğrulamaları. Bu ayarlar Cloudflare ve AdSense rehberinde.

Kendin kontrol et

curl -sI https://ornekblog.com/ads.txt | grep -iE "^HTTP|content-type"
curl -s  https://ornekblog.com/ads.txt | head -3
curl -sI http://ornekblog.com/ads.txt | grep -iE "^HTTP|location"

İyi sonuç: 200, text/plain ve yorum olmayan ilk satırda Google satırın. text/html ya da <!doctype html> görüyorsan baktığın şey dosyan değil, SPA yedeği. ads.txt kontrol aracı aynı testleri yapıyor, HTML gövdeleri ve yanlış kimlikleri işaretliyor. Cloudflare'in Google botlarına tarayıcılardan farklı davranıp davranmadığını görmek için Googlebot erişim kontrolünü kullan.

Sonra kendi alan adında ücretsiz taramayı çalıştır. ads.txt'yi HTTP ve HTTPS üzerinden, www'li ve www'siz kontrol ediyor, AdSense'in incelediği diğer her şeyle birlikte.

Eskimiş ya da yanlış bir şey mi gördün? Bize yaz, düzeltelim.

Bu rehberi İngilizce oku →

Kendi sitende kontrol et. Ücretsiz, kayıt yok.

Bunun için ücretsiz araçlar

Ücretsiz tarama

Kendi siteni kontrol et

Ücretsiz tarama: uygunluk puanı ve tüm sorunlar, genelde birkaç dakikada.

Ücretsiz tarama · puan ve bulunan tüm sorunlar · üyelik yok

Tüm rehberler →