PHP ile Last-Modified ve 304 Not Modified desteği

Googlebot bir sayfayı tekrar ziyaret ederken çoğu zaman "en son şu tarihte gördüm, değişti mi?" diye soruyor (If-Modified-Since). Sunucun "değişmedi" (304) derse, sayfanın tamamı tekrar gönderilmiyor. Hem sunucu yükü düşüyor hem de tarama bütçesi değişen sayfalara kalıyor.

Statik dosyalarda bunu sunucu kendisi yapıyor. Dinamik PHP sayfalarında ise senin eklemen gerekiyor.

conditional.php
<?php
declare(strict_types=1);

/**
 * İçeriğin son değişme zamanı ve özeti verilir; istemci güncelse 304 döner ve çıkar.
 */
function conditional_get(int $lastModified, string $etagSource): void
{
    $etag = '"' . substr(sha1($etagSource), 0, 16) . '"';
    header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
    header('ETag: ' . $etag);
    header('Cache-Control: no-cache'); // tarayıcı her seferinde sorsun, ama tekrar indirmesin

    $inm = $_SERVER['HTTP_IF_NONE_MATCH'] ?? '';
    $ims = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'] ?? '') ?: 0;

    if (($inm !== '' && trim($inm) === $etag) || ($inm === '' && $ims >= $lastModified)) {
        http_response_code(304);
        exit;
    }
}

// kullanım
$post = ['updated_at' => '2024-08-11 18:25:00', 'content' => '...'];
conditional_get(strtotime($post['updated_at']), $post['updated_at'] . $post['content']);
// ... sayfanın geri kalanı

Test

# ilk istek: 200 ve Last-Modified
curl -sI https://ornek.com/yazi | grep -iE '^HTTP|last-modified|etag'

# koşullu istek: 304 bekliyoruz
curl -sI -H 'If-Modified-Since: Sun, 11 Aug 2024 15:25:00 GMT' https://ornek.com/yazi | head -1

Dikkat

Last-Modified gerçekten içeriğin değiştiği zaman olmalı. Sayfada "son yorumlar" gibi sürekli değişen bir kutu varsa, onun zamanını da hesaba kat. Yoksa ziyaretçiler eski sürümü görür.

Comments / questions

There's no comment section here. If you have a question or want to add something, message me on Telegram or send an email to [email protected]. Thanks!

Related pages