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.

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
ads.txt'yi framework'ünün build çıktısına kopyaladığı klasöre koy: Vite, Next.js, Astro ve Create React App içinpublic/, Hugo ve SvelteKit içinstatic/. Düz HTML sitedeindex.html'in yanına.- Deploy et, sonra dosyanın build'e girdiğini görmek için
https://projen.pages.dev/ads.txtadresini aç. - 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.htmlekle, 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.comgibi 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
- /tools/ads-txt-checkerads.txt Kontrol Aracı/ads.txt dosyasının her satırını doğrular, Google'ın senin yayıncı kimliğinle listelendiğini kontrol eder.Aracı aç
- /tools/googlebot-access-checkerGooglebot Erişim KontrolüAna sayfanı Googlebot ve AdSense botu olarak açar, her birinin ne aldığını karşılaştırır.Aracı aç
Ücretsiz tarama
Kendi siteni kontrol et
Ücretsiz tarama: uygunluk puanı ve tüm sorunlar, genelde birkaç dakikada.