İçeriğe atla
Cloudflare Wiki

    gez · aç · Esc kapat

    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şkenDeğer
    CItrue
    CF_PAGES1
    CF_PAGES_COMMIT_SHACommit hash’i
    CF_PAGES_BRANCHBranch adı
    CF_PAGES_URLBu 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.jssite.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

    1. 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.
    2. 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

    ÖzellikWorkersPages
    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 Objectskı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.dev ile çalışmıyor; Error 1000: DNS points to prohibited IP verir.
    • 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 source path, 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=pages

    Adım 1 — Depoyu bağla

    Panel → Workers & PagesCreate applicationPagesConnect to Git.

    Create application → Pages → Connect to Git ekranı; GitHub ve GitLab seçenekleri görünsün
    Install & Authorize sonrası depo listesi; hangi depoyu seçtiğimiz görünsün

    Adım 2 — Build ayarları

    Build settings ekranı — framework preset seçili, build command ve build output directory dolu, production branch görünür

    Adım 3 — İlk deploy

    Deployment detail ekranındaki build log'un sonu: 'Success: Assets published!' satırı ve yüklenen dosya sayısı
    Tarayıcıda <proje>.pages.dev adresi ve açılan site

    Adım 4 — Preview branch

    git checkout -b gelistirme
    git commit --allow-empty -m "preview testi"
    git push -u origin gelistirme
    Deployments sekmesinde preview kaydı; hem hash adresi hem gelistirme.<proje>.pages.dev takma adı görünsün

    Adım 5 — Rollback

    All deployments listesinde üç nokta menüsü açık, 'Rollback to this deployment' seçeneği görünür

    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:

    PagesWorkers
    pages_build_output_dirassets.directory
    wrangler pages devwrangler dev
    wrangler pages deploywrangler deploy
    Yerel port 8788Yerel port 8787
    _headers, _redirectsaynen çalışır

    Adım 2 — Çalıştır ve karşılaştır

    npx wrangler dev      # http://localhost:8787
    npx wrangler deploy
    Terminal çıktısı — yüklenen asset sayısı, Worker sürüm kimliği ve workers.dev adresi
    Workers & Pages → yeni Worker → Metrics: Asset requests ve Invocations sayaçları yan yana

    Adım 3 — Workers Builds ile CI/CD

    Worker → Settings → Build: build command, deploy command ve non-production branch deploy command alanları
    GitHub PR'ında Cloudflare'in bıraktığı preview URL yorumu

    Ölçüm: öncesi ve sonrası

    Demo tamamlandığında bu tablo gerçek değerlerle doldurulacak.

    ÖlçütPagesWorkers
    Yayına alma süresi
    Statik istek maliyeti
    Cron Trigger kullanılabilir mihayırevet
    Workers Logsyokvar
    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)
    İstekGünde 100.000Ayda 10 milyon dahil, sonrası milyon başına 0,30 USD
    CPU süresiÇağrı başına 10 msAyda 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ı

    FreeProBusiness
    Aylık build5005.00020.000
    Eşzamanlı build1520
    Build zaman aşımı20 dk20 dk20 dk
    Custom domain (proje başına)100250500

    Diğer sınırlar

    SınırDeğer
    Site başına dosya20.000 (Free) · 100.000 (Pro ve üzeri)
    100.000 sınırını açmakPAGES_WRANGLER_MAJOR_VERSION=4 ortam değişkeni
    Tek dosya boyutu25 MiB
    Hesap başına proje100
    Build cache10 GB/proje, son okumadan 7 gün sonra silinir
    Preview deploymentSı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.json yazmazsanı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ı exclude ile 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 deploy ile 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.dev alt 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_dir yerine assets.directory, wrangler pages dev/deploy yerine wrangler dev/deploy yazılır; _headers ve _redirects dosyaları 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=4 ortam 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.

    Hata bildir

    Yanlış bir rakam, eskimiş bir bilgi veya bozuk bir bağlantı mı buldun? Bildir, kaynağıyla birlikte kontrol edelim.