Pages
Git deposuna push ettiğinde frontend sitesini build edip global olarak yayına alır. Yeni projeler için Cloudflare artık Workers öneriyor.
- DurumGenel kullanımda
- FiyatStatik istekler ücretsiz ve sınırsız; yalnızca Functions çalıştığında Workers gibi ücretlendirilir
- Ücretsiz katmanvar
- Doğrulama
Pages nedir?
Cloudflare Pages, Git deposuna bağlanan bir barındırma platformudur. Bir branch’e push ettiğinde
Cloudflare projeyi derler, çıkan dosyaları ağına dağıtır ve sana bir *.pages.dev adresi verir.
Her branch için ayrı bir preview adresi üretir, ve istersen sunucu tarafı kod da çalıştırabilirsin
(Pages Functions).
Ancak bu sayfanın en önemli bilgisi ürünün ne yaptığı değil, Cloudflare’in bu ürün hakkında ne dediğidir.
Bu portalın Pages sayfasının var olma sebebi de bu: Türkçe kaynakların çoğu hâlâ Pages’i yeni projeler için öneriyor. 2026’da bu tavsiye güncel değil.
Nasıl çalışır?
Build hattı
Üç ayar belirlersin: build komutu, çıktı dizini ve gerekirse monorepo için kök dizin. Cloudflare bu komutu çalıştırır ve çıkış koduna bakar.
Kritik davranış: Pages bir build’in başarılı olup olmadığını yalnızca çıkış kodundan anlar.
Resmî ifade: “An exit code of 0 will cause the Pages build to be marked as successful and assets
will be uploaded regardless of if error logs are written to standard error.” Yani stderr’e
hata yazan ama 0 dönen bir build başarılı sayılır ve eksik içerik yayına çıkar.
Build sırasında şu değişkenler otomatik tanımlanır:
| Değişken | Değer |
|---|---|
CI | true |
CF_PAGES | 1 |
CF_PAGES_COMMIT_SHA | Commit hash’i |
CF_PAGES_BRANCH | Branch adı |
CF_PAGES_URL | Bu deploy’un URL’i |
Build adımı olmayan projelerde build komutu olarak exit 0 yazılır.
Preview deployment’lar
Production dışındaki her branch iki adres alır: kalıcı bir hash adresi
(<hash>.<proje>.pages.dev) ve bir branch takma adı (<branch>.<proje>.pages.dev).
Branch adları normalleştirilir: fix/api branch’i fix-api.<proje>.pages.dev olur. Hash
adresleri kalıcıdır — “These are atomic and may always be visited in the future.”
Pull request’lerde preview otomatik oluşur, ama yalnızca deponun kendisinden gelen branch’lerde. Fork’tan gelen PR’larda preview üretilmez.
İstekler nasıl karşılanır
Pages’in yönlendirme sırası, Workers’ın tam tersidir ve geçiş yapanların en sık düştüğü tuzak budur:
Diğer davranışlar: .html uzantılı dosyalar uzantısız adreslerine yönlendirilir, 404 çözümlemesi
dizin ağacında yukarı doğru en yakın 404.html’i arar, ve üst düzeyde 404.html yoksa Pages
projeyi tek sayfa uygulaması varsayar. Statik dosyalar otomatik olarak Tiered Cache üzerinden
sunulur.
Pages Functions aslında Workers’tır
Resmî ifade: “All Pages Functions are billed as Workers. All pricing and inclusions in this
document apply to Pages Functions.” Functions dosya tabanlı yönlendirme kullanır:
/functions/helloworld.js → site.com/helloworld, [user].js tek segment, [[user]].js
herhangi bir derinlik.
Ne zaman kullanılır, ne zaman kullanılmaz
Pages’i seçmek için kalan iki geçerli sebep
- Alan adının nameserver’ları Cloudflare’de değil. Resmî ifade: “Unlike Pages, Workers does not support any domain whose nameservers are not managed by Cloudflare.” Yalnızca CNAME ekleyebiliyorsanız Workers bir seçenek değil.
- Production ve preview için farklı binding’ler gerekiyor. Resmî ifade: “Unlike Pages, Workers does not natively support defining different bindings in production vs. non-production builds.” Workers tarafında geçici çözüm Wrangler Environments.
Pages’te olmayan, Workers’ta olan şeyler
| Özellik | Workers | Pages |
|---|---|---|
| Cron Triggers | ✅ | ❌ |
| Queue Consumers | ✅ | ❌ |
| Email Workers | ✅ | ❌ |
| Rate Limiting binding | ✅ | ❌ |
| Image Resizing binding | ✅ | ❌ |
| Workers Logs | ✅ | ❌ |
| Logpush | ✅ | ❌ |
| Tail Workers | ✅ | ❌ |
| Source Maps | ✅ | ❌ |
| Gradual Deployments | ✅ | ❌ |
| Cloudflare Vite plugin | ✅ | ❌ |
Uzaktan geliştirme (--remote) | ✅ | ❌ |
| Durable Objects | ✅ | kısmi — ayrı Worker gerekir |
| Statik dosyaları bir yol altında sunma | ✅ | ❌ |
Diğer sınırlar
- Hesap başına 100 proje. Resmî not: “This limit is not routinely increased.”
- Advanced Certificates çalışmaz — resmî bilinen sorun.
- Wildcard custom domain (
*.alanadi.com) desteklenmiyor. - Cloudflare Load Balancer
*.pages.devile çalışmıyor;Error 1000: DNS points to prohibited IPverir. - Incremental build yok.
- Git bağlantılı proje sonradan Direct Upload’a çevrilemez.
Somut örnekler
1. Güvenlik başlıkları — _headers
Build çıktı dizinine, uzantısız _headers dosyası:
# Yorum satırı
/secure/page
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer
/static/*
Access-Control-Allow-Origin: *
X-Robots-Tag: nosnippet
# Preview adreslerini arama motorlarından gizle
https://myproject.pages.dev/*
X-Robots-Tag: noindex
Miras alınan bir başlığı kaldırmak için ! öneki:
/*
Content-Security-Policy: default-src 'self';
/*.jpg
! Content-Security-Policy
Sınırlar: en fazla 100 kural, satır başına 2.000 karakter. Birden fazla kural eşleşirse başlıklar birleşir; aynı başlık iki kez tanımlanırsa değerler virgülle birleştirilir.
2. Eski URL’leri taşıma — _redirects
/home301 / 301
/eski-blog/* https://blog.alanadi.com/:splat
/urunler/:kod/:ad /urunler?kod=:kod&ad=:ad
/twitch https://twitch.tv
Varsayılan kod 302. Kritik kurallar:
- “The order of your redirects matter. If there are multiple redirects for the same
sourcepath, the top-most redirect is applied.” - “Static redirects should appear before dynamic redirects.”
- “Redirects are always followed, regardless of whether or not an asset matches the incoming request.”
Sınırlar: 2.000 statik + 100 dinamik = toplam 2.100 kural, kural başına 1.000 karakter. Desteklenmeyen: sorgu parametresine göre eşleşme, ülke/dil bazlı yönlendirme, çerez bazlı yönlendirme.
3. Fatura kontrolü — _routes.json
Bu dosya Pages’te en çok para kazandıran (ve yokluğunda en çok para kaybettiren) ayardır.
{
"version": 1,
"include": ["/api/*"],
"exclude": ["/build/*", "/assets/*"]
}
Resmî gerekçe: “On a purely static project, Pages offers unlimited free requests. However, once you add Functions on a Pages project, all requests by default will invoke your Function. To continue receiving unlimited free static requests, exclude your project’s static routes.”
exclude her zaman include’dan önceliklidir. En az bir include kuralı zorunlu; toplam en
fazla 100 kural, kural başına 100 karakter.
4. Basit bir Function
Dosya proje kökündeki /functions dizinine konur — build çıktısının içine değil.
// functions/api/saat.js → site.com/api/saat
export function onRequest(context) {
return Response.json({
saat: new Date().toISOString(),
ulke: context.request.cf?.country ?? null,
});
}
onRequest bir Response veya Promise<Response> döndürmek zorundadır.
Demo 1: Git bağlantılı site yayına alma
Bu demoyu birlikte yapacağız. Hedef: bir statik siteyi Git üzerinden yayına almak, preview branch ve rollback davranışını görmek.
npm create cloudflare@latest -- --platform=pagespnpm create cloudflare@latest --platform=pagesyarn create cloudflare --platform=pagesAdım 1 — Depoyu bağla
Panel → Workers & Pages → Create application → Pages → Connect to Git.
Adım 2 — Build ayarları
Adım 3 — İlk deploy
Adım 4 — Preview branch
git checkout -b gelistirme
git commit --allow-empty -m "preview testi"
git push -u origin gelistirme
Adım 5 — Rollback
Demo 2: Aynı projeyi Workers’a taşıma
Bu ikinci demo, sayfanın ana tezini uygulamalı gösterir: aynı site Workers üzerinde nasıl duruyor?
Adım 1 — Yapılandırmayı çevir
wrangler.jsonc:
{
"name": "sitem",
"compatibility_date": "2026-08-31",
"assets": {
"directory": "./dist",
"not_found_handling": "404-page"
}
}
Karşılıklar:
| Pages | Workers |
|---|---|
pages_build_output_dir | assets.directory |
wrangler pages dev | wrangler dev |
wrangler pages deploy | wrangler deploy |
| Yerel port 8788 | Yerel port 8787 |
_headers, _redirects | aynen çalışır |
Adım 2 — Çalıştır ve karşılaştır
npx wrangler dev # http://localhost:8787
npx wrangler deploy
Adım 3 — Workers Builds ile CI/CD
Ölçüm: öncesi ve sonrası
Demo tamamlandığında bu tablo gerçek değerlerle doldurulacak.
| Ölçüt | Pages | Workers |
|---|---|---|
| Yayına alma süresi | — | — |
| Statik istek maliyeti | — | — |
| Cron Trigger kullanılabilir mi | hayır | evet |
| Workers Logs | yok | var |
| Cloudflare dışı nameserver’lı alan adı | çalışır | çalışmaz |
Fiyatlandırma
Aşağıdaki rakamlar 31 Ağustos 2026’da resmî kaynaklardan doğrulanmıştır.
Statik içerik
Resmî ifade: “On both free and paid plans, requests to static assets are free and unlimited.” Egress ve bant genişliği ücreti de yoktur.
Functions
Pages Functions birebir Workers gibi ücretlendirilir:
| Ücretsiz | Ücretli (Standard) | |
|---|---|---|
| İstek | Günde 100.000 | Ayda 10 milyon dahil, sonrası milyon başına 0,30 USD |
| CPU süresi | Çağrı başına 10 ms | Ayda 30 milyon CPU ms dahil, sonrası milyon başına 0,02 USD |
| Süre (duration) | Ücretlendirilmez | Ücretlendirilmez, sınır yok |
Ücretli plan tabanı: “a minimum charge of $5 USD per month for an account.” Ücretsiz planda Workers ve Pages Functions aynı günlük kotayı paylaşır — 50.000 Function + 50.000 Worker isteği toplam 100.000’i doldurur. Kota her gün UTC gece yarısı sıfırlanır.
Build kotaları
| Free | Pro | Business | |
|---|---|---|---|
| Aylık build | 500 | 5.000 | 20.000 |
| Eşzamanlı build | 1 | 5 | 20 |
| Build zaman aşımı | 20 dk | 20 dk | 20 dk |
| Custom domain (proje başına) | 100 | 250 | 500 |
Diğer sınırlar
| Sınır | Değer |
|---|---|
| Site başına dosya | 20.000 (Free) · 100.000 (Pro ve üzeri) |
| 100.000 sınırını açmak | PAGES_WRANGLER_MAJOR_VERSION=4 ortam değişkeni |
| Tek dosya boyutu | 25 MiB |
| Hesap başına proje | 100 |
| Build cache | 10 GB/proje, son okumadan 7 gün sonra silinir |
| Preview deployment | Sınırsız |
Lisanslama ve hukuki çerçeve
Pages tescilli bir hizmettir; kullanımı Cloudflare Hizmet Şartları ile düzenlenir. Yüklediğin içeriğin ve kodun mülkiyeti sende kalır.
Build ortamı Cloudflare’in altyapısında çalışır; build sırasında kullandığın gizli değişkenler (API anahtarları vb.) Cloudflare’in ortam değişkeni deposunda saklanır. Kurumsal kullanımda ilgili belgeler Veri İşleme Ek Sözleşmesi ve alt işleyici listesidir.
Statik içerik dünya genelindeki tüm Cloudflare noktalarına dağıtılır. İçeriğin belirli bir coğrafyada kalması gerekiyorsa Pages uygun bir seçenek değildir; Data Localization Suite Pages’i kapsamaz.
Sık yapılan hatalar
_routes.json yazmamak. Tek bir Function eklediğiniz anda tüm statik istekler de faturalanmaya
başlar. Pages’te en pahalı ihmal budur.
/functions klasörünü build çıktısının içine koymak. Resmî uyarı: “Make sure that the
/functions directory is at the root of your Pages project (and not in the static root, such as
/dist).” Yanlış yerdeyse Functions sessizce çalışmaz.
_headers ve _redirects’in Functions yanıtlarına da uygulandığını sanmak. Uygulanmaz.
SSR kullanıyorsanız başlıkları kod içinde set edin.
Build’in “başarılı” görünüp eksik deploy edilmesi. Çıkış kodu 0 dönen bir build, stderr’e
hata yazsa bile başarılı sayılır. Build komutunuzun hata durumunda gerçekten sıfırdan farklı
kod döndürdüğünden emin olun.
Node sürümünü ayarlamamak. Varsayılan hâlâ eski bir sürüm; NODE_VERSION ortam değişkenini
tanımlayın. Aynı şey Hugo için HUGO_VERSION ile geçerli.
Panelde eklemeden elle CNAME kaydı açmak. Önce panelden custom domain eklenmeli; tersi sırada 522 hatası alırsınız. Bu resmî bir bilinen sorundur.
Custom domain’e Cache Rule eklemek. Deploy sonrası eski içerik servis edilir.
25 MiB üstü dosya yüklemeye çalışmak. Sınır serttir; resmî çözüm dosyayı R2 public bucket’ta barındırmaktır.
Sıkça sorulan sorular
- Yeni bir projeye Pages ile mi başlamalıyım?
- Hayır. Cloudflare’in kendi dokümantasyonu Pages sayfasının en üstünde şu uyarıyı gösteriyor: “Are you sure you want to use Pages? Workers supports most Pages use cases and offers a broader feature set. It is Cloudflare’s primary platform for building applications. Start new projects with Workers.” Pages yalnızca Workers’ın karşılayamadığı iki durumda tercih edilmeli: alan adının nameserver’ları Cloudflare’de değilse, veya production ile preview için ayrı binding tanımlamanız gerekiyorsa.
- Pages kapatılıyor mu, deprecated mi?
- Hayır. Hiçbir resmî Cloudflare sayfasında Pages için “deprecated”, “sunset”, “maintenance mode” veya “legacy” ifadesi geçmiyor; yayımlanmış bir kapanma tarihi de yok. Ama 8 Nisan 2025 tarihli blog yazısı net: “Cloudflare Pages will continue to be supported, but, going forward, all of our investment, optimizations, and feature work will be dedicated to improving Workers.” Yani destek sürüyor, yeni özellik gelmiyor. Doğru ifade “kapanıyor” değil, “yeni yatırım almıyor”.
- Statik site barındırmak gerçekten ücretsiz mi?
- Evet. Resmî ifade: “On both free and paid plans, requests to static assets are free and unlimited.” Egress veya bant genişliği ücreti de yok. Ücret yalnızca Pages Functions çalıştığında başlar — ve o da Workers fiyatlandırmasına tabidir.
- Functions ekleyince faturam patlar mı?
_routes.jsonyazmazsanız evet. Resmî uyarı: “once you add Functions on a Pages project, all requests by default will invoke your Function.” Yani tek bir Function eklediğiniz anda statik dosya istekleri de faturalanmaya başlar. Çözüm, statik yollarıexcludeile dışarıda bırakmak — o istekler tekrar ücretsiz olur.- Ücretsiz planda kaç build hakkım var?
- Ayda 500 build, aynı anda 1 build, build başına en fazla 20 dakika. Pro’da 5.000/ay ve 5 eşzamanlı, Business’ta 20.000/ay ve 20 eşzamanlı. Dikkat: bu kademeler Workers planına değil, alan adının zone planına (Free/Pro/Business) bağlı. Bu ayrım sık karıştırılıyor.
- Alan adım Cloudflare’de değil, yine de kullanabilir miyim?
- Pages’te evet, subdomain için bir CNAME yeterli. Workers’ta hayır — resmî ifade: “Unlike Pages, Workers does not support any domain whose nameservers are not managed by Cloudflare.” Bu, 2026’da Pages’i seçmek için kalan en güçlü teknik gerekçedir.
- Bitbucket kullanıyorum, otomatik deploy olur mu?
- Doğrudan olmaz. Pages yalnızca GitHub ve GitLab ile otomatik CI/CD kurar, self-hosted GitHub/GitLab de desteklenmiyor. Direct Upload projesi açıp kendi CI’ınızdan
wrangler pages deployile yayına almanız gerekir. - Git bağlantılı projeyi sonradan Direct Upload’a çevirebilir miyim?
- Hayır. Resmî ifade: “If you deploy using the Git integration, you cannot switch to Direct Upload later.” Projeyi silip yeniden oluşturmanız gerekir. Aynı şekilde
*.pages.devalt alan adı da sonradan değiştirilemez. - Pages’ten Workers’a geçmek zor mu?
- Genelde değil. Resmî geçiş rehberi “often a straightforward process” diyor.
pages_build_output_diryerineassets.directory,wrangler pages dev/deployyerinewrangler dev/deployyazılır;_headersve_redirectsdosyaları aynen çalışır. Cloudflare ayrıca yapay zekâ araçlarına verilebilecek hazır bir geçiş promptu yayımlıyor:developers.cloudflare.com/workers/prompts/pages-to-workers.txt - 20.000 dosya sınırına takıldım, ne yapmalıyım?
- Proje ayarlarında
PAGES_WRANGLER_MAJOR_VERSION=4ortam değişkenini tanımlayın; sınır 100.000’e çıkar (Pro ve üzeri planlarda). Tek dosya boyutu sınırı 25 MiB’dir ve değişmez; daha büyük dosyalar için resmî öneri R2 public bucket kullanmaktır. - Neden fork’tan gelen pull request’lerde preview oluşmuyor?
- Tasarım gereği. Resmî ifade: “Commits/PRs from forked repositories will not create a preview.” Preview yalnızca deponun kendisinden gelen branch’lerde üretilir. Açık kaynak projelerde katkı akışını buna göre planlayın.
- Deploy ettim ama eski içerik görünüyor.
- Büyük ihtimalle custom domain üzerinde bir Cache Rule tanımlısınız. Resmî bilinen sorun: “if you add caching to your custom domain, it may lead to stale assets being served after a deployment.” Pages zaten kendi cache’ini deploy başına yönetir; üstüne manuel cache kuralı eklemeyin.
İlgili servisler
- WorkersJavaScript/TypeScript/Python kodunu Cloudflare’in 330+ şehirdeki sunucularında, sunucu yönetmeden çalıştırır.
- Workers ObservabilityWorker loglarını, request trace’lerini ve error rate’i harici araç kurmadan gösterir.
- R2S3 uyumlu object storage — çıkış (egress) trafiği ücretsiz.
- D1Workers’a bağlanan serverless SQLite veritabanı.
- Browser RenderingKod içinden headless Chrome sürer: ekran görüntüsü, PDF, sayfa kazıma, otomasyon.
Bu sayfadaki fiyat ve özellik bilgileri 31 Ağustos 2026 tarihinde Cloudflare’in resmî kaynaklarından doğrulanmıştır. Cloudflare fiyatlandırmasını önceden haber vermeden değiştirebilir; bağlayıcı bilgi içinresmî sayfaya bakın.