Yayınlama yaptığınız her seferde site haritanızı tamamlanmış herkese açık sayfa kümesinden yeniden oluşturun, ardından ikisini birlikte yükleyin. Bu Mac iş akışı, eklenen sayfaları dahil edip kaldırılanları otomatik olarak çıkarmak için küçük bir Python betiği kullanır ve herkese açık sonucu denetler.

Buradaki görev, Mac’ten dışa aktarılan küçük ve statik bir web sitesinin site haritasını güncel tutmaktır. Örnekte renkler hakkında kurgusal sayfalar kullanılıyor. Dışa aktarma klasörünü yükleyebilen ve herkese açık siteden eski dosyaları kaldırabilen mevcut bir yayınlama süreciniz olduğu varsayılıyor.

Site haritasının yeniden oluşturulacağı yeri seçin

Önce yayınlama sisteminizin zaten bir site haritası oluşturup oluşturmadığını kontrol edin. Google, birçok içerik yönetim sisteminin bunu otomatik olarak sağladığını belirtiyor. Sisteminiz sağlıyorsa başka bir oluşturucu eklemeden önce bir test sayfasını ekleyip kaldırdıktan sonra site haritasını kontrol edin. Site haritaları hakkında bilgi edinin.

Statik bir dışa aktarma için şu sırayı izleyin: sayfaların dışa aktarımını tamamlayın, site haritasını bu dışa aktarımdan oluşturun ve ortaya çıkan klasörü yayınlayın. Bu, önerilen bir uygulama biçimidir: site haritasının yayınlayıcıya iletilen sayfa kümesini tanımlamasını sağlar.

Yayınlama sırasında oluşturmak, ekleme ve kaldırmalar için tutarlı tek bir kural da sağlar. Tamamlanmış dışa aktarımda bulunan sayfa dahil edilir; bulunmayan sayfa dışarıda bırakılır. Güncellemeyi hatırlamanız gereken ayrı bir liste olmaz.

Mevcut kurulumunuza uygun entegrasyonu seçin:

Mevcut yayınlama kurulumu Yeniden oluşturmanın yapılacağı yer
Bir CMS site haritasını zaten yönetiyor Bu oluşturucuyu kullanmaya devam edin ve sayfa değişikliklerine verdiği yanıtı test edin
Statik dışa aktarıcı, dışa aktarma sonrasında bir komutu destekliyor Yüklemeden önce oluşturucuyu burada çalıştırın
Mevcut bir komut tamamlanmış bir klasörü yayınlıyor Bu komutu oluşturucunun isteğe bağlı yayınlama argümanıyla çalıştırın
Masaüstü arayüzü üzerinden yükleme yapıyorsunuz Önce oluşturun, ardından klasörün tamamını yükleyin; gözetimsiz herkese açık güncellemeler için desteklenen bir yayınlama entegrasyonu gerekir

Yerel bir betik uzaktaki bir web sitesini kendi başına değiştiremez. Aşağıdaki iş akışı site haritası oluşturmayı otomatikleştirir ve mevcut bir yayınlama komutunu başlatabilir. Gerçek yükleme, kullandığınız yayınlayıcının sorumluluğundadır.

Site haritasına tam olarak hangi sayfaların gireceğini belirleyin

Sıradan sayfa URL’leri için Google, her satırda tam bir URL bulunan bir metin site haritasını kabul eder. Bu görev için XML isteğe bağlıdır. Aynı içeriğin birden fazla URL sürümünü değil, her sayfanın tercih edilen herkese açık URL’sini ekleyin. Site haritası oluşturun ve gönderin.

Metin biçimi UTF-8 kodlaması gerektirir ve başlık ya da yorum içermeden yalnızca URL’lerden oluşur. Tek bir dosya en fazla 50.000 URL ve 52.428.800 bayt içerebilir. Bu örnekte site haritasını site köküne koyun; böylece bu konumun altındaki dışa aktarılmış sayfaları kapsar. Site Haritaları protokolü: metin dosyaları ve konum.

Oluşturucu özellikle basit bir dışa aktarma kuralı kullanır:

Dışa aktarılan dosya Örnek herkese açık URL
public/index.html https://example.com/
public/colors/blue.html https://example.com/colors/blue.html
public/tiles/index.html https://example.com/tiles/

Bu kuralı yalnızca barındırıcınız tam olarak bu URL’leri sunuyorsa kullanın. Yayınlayıcınız blue.html dosyasını /colors/blue/ adresine dönüştürüyorsa veya siteyi /collection/ gibi bir yol altında sunuyorsa, yayınlayıcının rota listesini kullanın ya da yayınlamadan önce eşlemeyi uyarlayın. Dosya adlarını taramak, özel yönlendirme kurallarını ortaya çıkaramaz.

Dışa aktarma klasöründe yalnızca dışa aktarımda bulunması amaçlanan sayfaları tutun. Bu örnek noktayla başlayan yolları ve adı 404.html olan dosyaları atlar; sayfa meta verilerini, standart URL bildirimlerini veya yönlendirme kurallarını incelemez. Bu tür ek koşulları olan siteler, bunun yerine yayınlayıcılarının uygun sayfa envanterinden oluşturma yapmalıdır.

Normal gezinme bağlantılarını da güncel tutun. WHATWG, a öğelerinin href özniteliğiyle oluşturduğu köprüleri tanımlar; Google ise doğru bağlantı verilmiş sayfaların genellikle gezinme aracılığıyla keşfedilebildiğini açıklar. Site haritasını güncellerken eklenen veya kaldırılan sayfalara işaret eden bağlantıları da güncelleyin. WHATWG HTML Standardı: bağlantılar, Site haritaları hakkında bilgi edinin.

Mac’inizde oluşturucuyu hazırlayın

Python 3.8 veya üzeri ve düz metin düzenleyici gerekir. Kullanabileceğiniz yorumlayıcıyı kontrol etmek için Terminal’de python3 --version komutunu çalıştırın. Python’a ihtiyacınız varsa Python Software Foundation’ın macOS kurulum talimatlarını izleyin. Belgelerinde ayrıca Terminal’den python3 kullanarak betiklerin nasıl çalıştırılacağı açıklanıyor. macOS’ta Python kullanımı.

Masaüstünüzde sitemap-demo adlı bir klasör oluşturun. Aşağıdaki programın tamamını bu klasöre regenerate_sitemap.py adıyla kaydedin. Program Python’ın standart kitaplığını kullanır ve ek paket gerektirmez.

import argparse
from pathlib import Path, PurePosixPath
import subprocess
import tempfile
from urllib.parse import quote, urlsplit


def make_sitemap(paths, origin):
    parsed = urlsplit(origin)
    if (parsed.scheme not in ("http", "https") or not parsed.hostname
            or parsed.netloc != parsed.hostname
            or parsed.path not in ("", "/")
            or parsed.query or parsed.fragment):
        raise ValueError("Use a site origin, such as https://example.com")
    base = origin.rstrip("/")
    urls = set()
    for relative in paths:
        path = PurePosixPath(relative)
        if path.name == "index.html":
            parent = path.parent.as_posix()
            route = "" if parent == "." else parent + "/"
        else:
            route = path.as_posix()
        urls.add(base + "/" + quote(route, safe="/"))
    if not urls:
        raise ValueError("No eligible pages; sitemap was not replaced")
    if len(urls) > 50000:
        raise ValueError("Split the sitemap: more than 50,000 URLs")
    data = ("\n".join(sorted(urls)) + "\n").encode("utf-8")
    if len(data) > 50 * 1024 * 1024:
        raise ValueError("Split the sitemap: larger than 50 MB")
    return data


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("folder")
    parser.add_argument("origin")
    parser.add_argument("publish", nargs=argparse.REMAINDER)
    args = parser.parse_args()
    root = Path(args.folder).resolve()
    if not root.is_dir():
        parser.error("The export folder must already exist")
    paths = []
    for file in root.rglob("*.html"):
        relative = file.relative_to(root)
        if (file.is_file() and file.name != "404.html"
                and not any(p.startswith(".") for p in relative.parts)):
            paths.append(relative.as_posix())
    data = make_sitemap(paths, args.origin)
    target = root / "sitemap.txt"
    temporary = None
    try:
        with tempfile.NamedTemporaryFile(dir=root, delete=False) as handle:
            temporary = Path(handle.name)
            handle.write(data)
        temporary.replace(target)
    finally:
        if temporary is not None:
            temporary.unlink(missing_ok=True)
    print(f"Wrote {len(data.splitlines())} URLs to {target}", flush=True)
    if args.publish:
        subprocess.run(args.publish, check=True)


if __name__ == "__main__":
    main()

Her çalıştırma URL listesini baştan oluşturur. Sonucu sıralar ve yinelenenleri kaldırır, yollardaki boşluklar gibi karakterleri kodlar ve sitemap.txt dosyasını değiştirmeden önce geçici bir dosyaya yazar. Oluşturma hataları, isteğe bağlı yayınlama komutunun çalışmasını engeller.

Boş bir dışa aktarım bilerek hata oluşturur ve önceki site haritasını olduğu gibi bırakır. Böylece yanlış klasörün seçilmesi veya dışa aktarımın tamamlanmaması yakalanır. Tüm sayfaları bilerek kaldırmak, bu iş akışına boş bir dışa aktarım vermek yerine ayrıca bir yayınlama kararı gerektirir.

Yayınlamaya bağlamadan önce bir ekleme ve bir kaldırmayı test edin

Terminal’de örnek klasörünüze geçin:

cd "$HOME/Desktop/sitemap-demo"

Bu tam kurulum komutuyla iki kurgusal sayfa oluşturun. Yeni örnek klasöründe çalıştırın; belirtilen iki örnek dosyayı yazar.

python3 - <<'PY'
from pathlib import Path

root = Path("public")
(root / "colors").mkdir(parents=True, exist_ok=True)
pages = {
    "index.html": "<!doctype html><title>Color collection</title><p>Color collection.</p>",
    "colors/blue.html": "<!doctype html><title>Blue tile</title><p>A blue tile.</p>",
}
for name, content in pages.items():
    (root / name).write_text(content, encoding="utf-8")
PY

Yerel site haritasını oluşturup inceleyin. Örnek kaynak adresi temsili amaçlıdır; bu komutlar buraya hiçbir şey yayınlamaz.

python3 regenerate_sitemap.py public https://example.com
cat public/sitemap.txt

Beklenen dosyada tam olarak şu iki satır bulunur:

https://example.com/
https://example.com/colors/blue.html

Şimdi kurgusal mavi sayfayı yeşil bir sayfayla değiştirin:

python3 - <<'PY'
from pathlib import Path

root = Path("public")
(root / "colors/blue.html").unlink()
(root / "colors/green.html").write_text(
    "<!doctype html><title>Green tile</title><p>A green tile.</p>",
    encoding="utf-8",
)
PY
python3 regenerate_sitemap.py public https://example.com
cat public/sitemap.txt

Beklenen sonuç, ana sayfa URL’sinin ardından https://example.com/colors/green.html gelmesidir. Dışa aktarılan dosyası artık bulunmadığından mavi URL listeden çıkar. Bu işlem, değişikliği fark etmesi için arama motoruna bağlı kalmadan güncellemenin her iki yönünü de kontrol eder.

Yeniden oluşturmayı her yayınlamanın parçası hâline getirin

Gerçek siteniz için örnek klasörü ve kaynak adresini gerçek, tamamlanmış dışa aktarma klasörünüz ve herkese açık kaynak adresinizle değiştirin. Oluşturucuyu yalnızca dışa aktarma tamamlandıktan sonra çalıştırın ve yayınlama bitene kadar klasörde değişiklik yapmayın. Yayınlamaları sırayla gerçekleştirin.

Proje klasörünüzde deploy-site.sh adlı çalışan bir yayınlama betiğiniz varsa, aşağıdaki entegrasyon komutu site haritasını oluşturur ve ardından bu betiği çalıştırır. Bu örnek, mevcut betiğin bulunmasını gerektirir; oluşturucu betiği oluşturmaz veya barındırma yapılandırması sağlamaz.

python3 regenerate_sitemap.py public https://example.com sh ./deploy-site.sh

Yayınlama betiğiniz, public klasörünün tamamını, sitemap.txt dâhil, yüklemeli ve dışa aktarımdan kaybolan herkese açık dosyaları kaldırmalıdır. Site haritası oluşturulduktan sonra sayfaları yeniden oluşturmamalıdır. Siteyi de oluşturan bir yayınlayıcı kullanıyorsanız oluşturma işlemini derleme ve yükleme aşamalarının arasına koyun.

Oluşturma başarısız olursa yayınlama komutu atlanır. Yayınlama başarısız olursa Python hatayı bildirir ancak uzak site kısmen değişmiş olabilir. Yeniden denemeden önce herkese açık sonucu kontrol edin. Barındırıcınız tüm bir sürümü birlikte yayınlamayı destekliyorsa belgelenen bu yöntemi kullanın.

Masaüstü üzerinden yükleme yapıyorsanız dışa aktarma klasörünü yüklemek üzere seçmeden önce site haritasını oluşturun. Yükleyicinin mevcut site haritasını değiştirdiğini ve kaldırılan sayfaları uygun şekilde ele aldığını doğrulayın. Yine de yükleme işlemini sizin yapmanız gerekir; yerel otomatik oluşturma tek başına gözetimsiz herkese açık yayınlama sağlamaz.

Herkese açık site haritasını ve kaldırılan sayfayı ayrı ayrı doğrulayın

Başarılı bir yayınlamanın ardından tarayıcıda gerçek herkese açık sitemap.txt URL’nizi açın. Eklenen sayfanın göründüğünü ve kaldırılan sayfanın görünmediğini kontrol edin. Ardından etkilenen her sayfayı doğrudan ziyaret edin. Bu, doğru bir yerel dışa aktarımı doğru bir herkese açık sürümden ayırt etmenizi sağlar.

Bir site haritası girdisini silmek, o sayfanın eski adresinde verilecek HTTP yanıtını belirlemez. Yerine başka sayfa gelmeyen kaldırılmış bir sayfa için barındırıcının uygun bir sayfa bulunamadı yanıtı verdiğini kontrol edin. RFC 9110, geçerli bir gösterimi bulunmayan kaynaklar için 404 ve kullanılamama durumunun muhtemelen kalıcı olduğunun bilindiği durumlar için 410 kodlarını tanımlar. RFC 9110: HTTP Semantiği.

Sayfa, 200 döndürürken sayfa bulunamadı mesajı gösteriyorsa bu durum, sahte bir 404 olarak değerlendirilebilir. Google ayrıca, önceden dizine eklenmiş ve geçerli 4xx yanıtları döndüren URL’lerin zamanla dizininden çıkarıldığını belgeliyor. Bu nedenle URL’yi site haritasından kaldırmak, sayfayı kaldırmanın yalnızca bir parçasıdır. HTTP durum kodlarının Google tarayıcılarını nasıl etkilediği.

Bir sorun gördüğünüzde şu tanılama adımlarını izleyin:

Gözlem Sonraki kontrol
Yerel site haritasında kaldırılmış bir sayfa hâlâ listeleniyor Dışa aktarım klasöründe kalan bir dosya veya yanlış seçilmiş bir klasör olup olmadığına bakın
Yerel site haritası doğru, ancak herkese açık kopya farklı Yüklenen klasörü, hedef konumu ve önbelleği kontrol edin
Herkese açık site haritası doğru, ancak kaldırılan sayfa hâlâ açılıyor Yayınlamanın eski uzak dosyayı kaldırıp kaldırmadığını kontrol edin
Oluşturulan URL yanlış sayfayı açıyor Barındırıcının rota eşlemesini dosya adı kuralıyla karşılaştırın
Yeni URL herkese açık, ancak aramada görünmüyor Arama motorunun keşfetmesini ve dizine eklemesini ayrı bir süreç olarak değerlendirin

Önbellekleme, herkese açık site haritasının neden değişmemiş göründüğünü açıklayabilir. RFC 9111, önbelleğe alınmış yanıtların nasıl güncel kaldığını ve yeniden doğrulandığını tanımlar. Barındırıcınız yanıt başlıklarını yapılandırmayı destekliyorsa Cache-Control: no-cache, depolanmış bir yanıt yeniden kullanılmadan önce başarılı doğrulama yapılmasını gerektirir; yerel bir dosyayı değiştirmek bu başlığı yapılandırmaz. RFC 9111: HTTP Önbellekleme.

Tek ve sabit bir site haritası adresi kullanın

Herkese açık site haritasını Search Console’daki Sitemaps raporu üzerinden göndererek veya sitenin mevcut robots.txt dosyasında belirterek bulunabilir hâle getirin. Google her iki yöntemi de açıklar ve gönderimin bir ipucu olduğunu belirtir. Site haritası oluşturun ve gönderin.

Örnek site için keşif satırı şöyle olurdu:

Sitemap: https://example.com/sitemap.txt

Yayınlama sırasında içeriğini değiştirirken site haritası adresini sabit tutun. Tamamlandığını doğrulamak için herkese açık site haritasının tamamlanmış dışa aktarımla eşleştiğini, eklenen sayfanın listelenen URL’de açıldığını ve kaldırılan sayfanın amaçlanan yanıtı verdiğini kontrol edin. Arama motorları bu değişiklikleri kendi takvimlerine göre işler; site haritasında yer almak taranmayı veya dizine eklenmeyi garanti etmez. Site haritaları hakkında bilgi edinin.

Kaynaklar