Přejít na obsah

Ochrana před indexací (pojistka pro neprodukční prostředí) ​

Stagingová nebo místní kopie webu, která se dostane do Googlu, patří mezi nejčastější a nejškodlivější chyby SEO: duplicitní obsah soupeří se skutečnými stránkami, soukromé prostředí je v indexu a úklid pomocí nástroje pro odstranění URL trvá týdny. Typickou příčinou je noindex závislé jen na zapomenuté hodnotě v .env nebo pravidlo pro roboty přepsané při nasazení.

Ochrana před indexací tomuto scénáři předchází už svým návrhem. Indexovatelnost váže na prostředí Laravelu místo příznaku, na který musí někdo pamatovat: pokud aplikace běží mimo seznam povolených prostředí, každá stránka dostane vynucené noindex,nofollow, spravovaný robots.txt zablokuje všechny roboty a seo:audit na tento stav výrazně upozorní.

Jde o bezplatnou funkci balíčku Core.

Co se děje při aktivní ochraně ​

Pokud app()->environment() není v seo.indexing_guard.allowed_environments a ochrana je zapnutá, automaticky nastanou čtyři věci:

  1. Resolver vynutí noindex,nofollow na každé stránce. Toto pravidlo stojí nad celým řetězcem priorit a přepíše i výslovnou hodnotu robots uloženou pro konkrétní stránku v seo_meta.
  2. HTTP hlavička X-Robots-Tag: noindex,nofollow se odešle s každou odpovědí procházející aplikací — viz níže Odpovědi mimo HTML.
  3. SEO::robotsTxt()->build() vytvoří robots.txt zakazující vše (a také ai.txt): prosté User-agent: * / Disallow: /. Platí to pro příkaz seo:robots-txt i volitelnou dynamickou trasu.
  4. seo:audit zobrazí výrazné upozornění, aby vás při čtení reportu nepřekvapilo, že je všude noindex.

V povolených prostředích (ve výchozím nastavení production) je ochrana zcela nečinná: výstup se nemění a vykreslení zůstává totožné bajt po bajtu.

Odpovědi mimo HTML (PDF, kanály, obrázky) ​

Vynucená meta značka robots se dostane jen k robotům, kteří zpracovávají HTML. PDF, kanál RSS/Atom, obrázek ani jiná odpověď mimo HTML žádný <head> nemají. Aktivní ochrana proto prostřednictvím globálního middlewaru odesílá stejnou direktivu také v HTTP hlavičce:

http
X-Robots-Tag: noindex,nofollow

Hlavička i meta značka vycházejí ze stejného zdroje, takže si nemohou odporovat. Hlavička je v rámci ochrany ve výchozím nastavení zapnutá (samotná ochrana vyžaduje zapnutí a v povolených prostředích je nečinná). Pokud chcete ponechat pouze meta značku, vypněte ji:

php
'indexing_guard' => [
    'send_header' => env('SEO_INDEXING_GUARD_HEADER', true),
],

Middleware se registruje jen při zapnuté ochraně. S vypnutou ochranou tedy balíček do zásobníku middlewaru nic nepřidává.

Statické soubory obcházejí PHP

Soubor, který webový server vrací přímo z public/, do Laravelu vůbec nevstoupí, a tuto hlavičku proto nedostane. Takové soubory chraňte na okraji infrastruktury (konfigurací webového serveru nebo CDN). Ochrana pokrývá vše, co prochází aplikací.

Proč přepisuje výslovnou hodnotu robots ​

V ostatních částech Rankbeamu vyhrává výslovně uložená hodnota — právě k tomu slouží řetězec priorit. Ochrana je jedinou záměrnou výjimkou a stojí nad vrstvou výslovných hodnot, protože riziko zde existuje jen jedním směrem:

  • Stagingová databáze bývá kopií produkční databáze. Stránka s uloženým index,follow by si proto tuto direktivu přinesla i na staging a požádala o indexaci.
  • Chybná indexace stagingu je vážný problém; chybné nastavení noindex na stagingu nic nezmění. Ochrana tak tvoří nepřekročitelnou hranici pro uložené hodnoty právě v prostředích, která indexovat nechcete.

Zapnutí ​

Ochrana je po instalaci vypnutá. Instalace ani aktualizace balíčku tedy bez vašeho souhlasu nezmění výstup neprodukčního prostředí. Platí stejná zásada zachování bajtově totožného výstupu až do výslovného zapnutí jako u blank_is_unset v resolveru a generovaných OG obrázků. Zapnete ji jedním řádkem:

dotenv
SEO_INDEXING_GUARD=true

S výchozím seznamem povolených prostředí zůstává production beze změny, takže ochranu můžete ponechat zapnutou ve sdílené konfiguraci. Ověřte, že seznam obsahuje všechna prostředí, která chcete indexovat. Zapnutí důrazně doporučujeme; pro Core 4 se zvažuje zapnutí ve výchozím nastavení.

Vypnete ji opět jedním řádkem:

dotenv
SEO_INDEXING_GUARD=false

Výběr prostředí, která se smějí indexovat ​

Ve výchozím nastavení je povoleno pouze production. Seznam přepíšete proměnnou prostředí s hodnotami oddělenými čárkami:

dotenv
# Let a public preview environment index too
SEO_INDEXING_GUARD_ALLOWED="production,prod-eu"

Nebo v config/seo.php:

php
'indexing_guard' => [
    'enabled' => env('SEO_INDEXING_GUARD', false),
    'allowed_environments' => ['production', 'prod-eu'],
],

Položky se porovnávají pomocí Str::is(), takže fungují i zástupné znaky: 'prod*' odpovídá production i prod-eu:

php
'allowed_environments' => ['prod*'],

Prázdný seznam znamená, že se nesmí indexovat žádné prostředí — ochrana je aktivní všude, tedy v bezpečnějším směru. Pozor: prázdná hodnota proměnné SEO_INDEXING_GUARD_ALLOWED, včetně samotných mezer, se nahradí hodnotou ['production'], aby překlep nemohl nepozorovaně vyřadit produkci z indexu. Pokud opravdu chcete ochranu „všude“, zapište do konfigurace výslovně [].

Ověření ​

seo:audit zobrazí upozornění a ve výstupu --json uvede strojově čitelný stav:

bash
php artisan seo:audit --json
json
{
    "indexing_guard": {
        "active": true,
        "environment": "staging",
        "allowed_environments": ["production"],
        "directive": "noindex,nofollow"
    },
    "pages": [ /* ... */ ]
}

A takto vypadá obsluhovaný nebo vygenerovaný robots.txt v chráněném prostředí:

# robots.txt — managed by Rankbeam
# Indexing guard ACTIVE: this app is running in the "staging" environment,
# which is not in seo.indexing_guard.allowed_environments. Every crawler is
# disallowed so this non-production site stays out of search results.
# https://rankbeam.dev/guide/indexing-guard

User-agent: *
Disallow: /

Rozsah ​

Ochrana řídí direktivy pro indexaci: meta značku robots, hlavičku X-Robots-Tag a robots.txt. Nemění titulky, popisy, kanonické URL ani schéma. Je nezávislá na zásadách vykreslování robots (seo.robots.emit_default): protože se noindex,nofollow liší od výchozí hodnoty webu, značka se vykreslí vždy.

rankbeam/laravel-seo je distribuován pod licencí MIT.