# 404-kezelés

> Megnézzük, hogy egy nem létező címre az oldal 404-et ad-e; ha 200-at, az úgynevezett soft 404, ami hamis oldalakat vihet az indexbe.

Amikor valaki olyan címet nyit meg, ami nem létezik, a szervernek **404 Not Found** (vagy végleg megszűnt oldalnál 410 Gone) kóddal kell válaszolnia. A kód a gépeknek szól: a böngésző, a keresőrobot és a hivatkozásellenőrzők ebből tudják, hogy az oldal nincs meg. A látogatónak közben szép, használható hibaoldalt mutathatsz.

A gyakori hiba az úgynevezett **soft 404**: a szerver barátságos „nem található” oldalt rajzol, de közben 200-as kódot küld. A Google ezt hibaként jelzi a Search Console-ban, mert a tartalom hibára utal, miközben a kód sikert mond, és az index hamis oldalakkal telhet meg.

## Hogyan mérjük

A riport a nyitóoldal származási címére (origin) egy véletlenül generált, biztosan nem létező útvonalat kér le, ilyen formában: `/hellowp-report-404-<12 véletlen karakter>`. Legfeljebb 3 átirányítást követ, és a **végső válasz** kódját nézi.

- **Megfelelő:** `404` vagy `410`.
- **Hiba, `soft-404`:** `200`. Ide számít az is, ha a szerver a nem létező címet átirányítja a nyitóoldalra vagy egy keresőoldalra, ami 200-zal válaszol.
- **Hiba, `status`:** bármilyen más kód (például 403, 500, 301 vagy 302 a lánc végén).
- Ha a kérés nem sikerült vagy elfogyott a kéréskeret, a teszt nem értékelhető, és kimarad.

A teszt egyetlen véletlen útvonalat próbál, ezért a fájlkiterjesztéshez vagy konkrét útvonalhoz kötött eseteket (például egy hiányzó `.jpg`) nem fedi le.

## Hogyan javítsd

A cél: minden nem létező cím valódi 404-et adjon, és a hibaoldal tartalma is ezzel együtt jöjjön.

1. **Ne irányítsd át a hiányzó oldalakat a nyitóoldalra.** A gyakori „minden 404 menjen a főoldalra” szabály soft 404-et okoz. Hagyd a 404-et 404-nek.
2. **A hibaoldal kódja legyen 404.** Ha egyedi hibaoldalt használsz, ellenőrizd, hogy a szerver a kódot is helyesen küldi-e.
3. **Szükség esetén 410.** Ha egy oldalt tudatosan és végleg töröltél, a 410 Gone pontosabb jelzés, de a 404 is elfogadott.
4. **Átirányítás csak akkor,** ha az oldalnak valódi, megfelelő utódja van. Ilyenkor 301-es átirányítás kell a konkrét új címre.

### nginx

A statikus fájlokat kiszolgáló `location` blokkban a `try_files` utolsó paramétere dönti el, mi legyen, ha egyik fájl sincs meg. Az `=404` közvetlenül 404-es kódot ad:

```nginx title="nginx"
location / {
    try_files $uri $uri/ =404;
}
```

WordPressnél a permalinkek miatt az utolsó paraméter általában `/index.php?$args`; ilyenkor a 404-et a WordPress adja, ezért a témának kell helyes kódot küldenie.

### Apache (.htaccess)

Az `ErrorDocument` direktívában helyi útvonalat adj meg, ne teljes URL-t. A teljes URL (például `http://`-vel kezdődő) átirányítást küld a kliensnek, és az eredeti hibakód elvész, ami összezavarja a robotokat:

```apache title=".htaccess"
ErrorDocument 404 /404.html
```

### WordPress

WordPressben a `404.php` sablon (vagy blokkos témánál a 404-es sablon) jeleníti meg a hibaoldalt. Ha a nem létező címre mégis 200 jön:

- kapcsold ki az átirányítás-, SEO- vagy gyorsítótár-bővítmények olyan funkcióit, amelyek a nem létező címeket a nyitóoldalra irányítják;
- nézd meg, hogy a téma `404.php` fájlja nem ír-e ki saját fejlécet, vagy nem irányít-e át.

## Hogyan ellenőrizd

Futtasd újra a riportot. Parancssorból:

```bash title="Terminál"
curl -sIL -o /dev/null -w "%{http_code} %{url_effective}\n" https://pelda.hu/ez-az-oldal-nincs-meg-12345
```

Az eredmény `404` legyen, és a végső cím maradjon az, amit kértél (ne a nyitóoldal). A Google Search Console jelzi a soft 404 hibákat, ha a keresőrobot már találkozott velük ([Google Search Console](https://hub.hellowp.io/hu/knowledge-base/useful-tools/google-search-console/)).
