Dokumentacija
Za manjkajoče strani vrnite 404
Za manjkajoče strani vrnite 404
Ko nekdo odpre naslov, ki ne obstaja, mora strežnik odgovoriti s statusom 404 Not Found (ali 410 Gone za stran, ki je bila odstranjena namerno). Veliko strani pokaže stran z napako, a jo pošlje s statusom 200 OK, ali pa vsak neznan naslov preusmeri na domačo stran. Obiskovalcu je videti enako. Za Google pa je to mehki 404 (soft 404): stran, ki trdi, da obstaja, a nima lastne vsebine.
Škoda je resnična. Google porablja čas za pajkanje na prazne naslove, stare povezave in tipkarske napake ostanejo za vedno "veljavne", poročila v Search Console pa se napolnijo z opozorili o mehkih 404, ki zakrijejo prave težave. Orodja za iskanje pokvarjenih povezav, tudi naše, manjkajoče strani ne ločijo od delujoče. Kontrolni seznam strani zahteva naslov, ki na vaši strani ne more obstajati, in opozori, kadar odgovor ni 404 ali 410.
Kaj ga povzroči
| Kaj se zgodi | Tipičen vzrok |
|---|---|
| Stran z napako, status 200 | stran z napako po meri, postrežena kot običajna stran; SPA ali pot, ki ujame vse in "ni najdeno" izriše v brskalniku; nginx try_files … /index.html |
| Preusmeritev na domačo stran | vtičnik WordPress, ki vse 404 pošlje na domačo stran; pravilo za preusmeritev na strežniku, CDN-ju ali v graditelju strani |
| Preusmeritev na stran z napako, nato 200 | Apache ErrorDocument s celim URL-jem; nginx error_page 404 z URL-jem; napake IIS v načinu preusmeritve |
Preusmeritvam sledimo kot brskalnik, zato manjkajoča stran, ki konča na domači strani s 200, šteje kot mehki 404. Preusmeritev s starega naslova na njegovo novo stran je v redu; za to so preusmeritve. Pošiljanje vsakega neznanega naslova na domačo stran ni.
Preverite sami
Namesto example.com vpišite svojo stran. Spodnji naslov ne obstaja na nobeni strani:
curl -s -o /dev/null -w '%{http_code} %{url_effective}\n' -L https://example.com/this-page-does-not-exist-7f3a
curl -sI https://example.com/this-page-does-not-exist-7f3a | grep -iE '^(HTTP|location):'
Prvi ukaz sledi preusmeritvam in izpiše končni status in naslov, drugi pokaže prvi odgovor. Popravljeno pomeni 404 (ali 410) v obeh, brez glave Location.
Kako popraviti
Izberite tisto, do česar imate dostop. Cilj je povsod isti: lepo stran z napako obdržite, a jo pošljite s statusom 404 in na naslovu, ki ga je obiskovalec zahteval.
WordPress
WordPress sam za manjkajoč naslov vrne 404, s predlogo 404.php iz teme. Kadar ga ne, to spremeni nekaj drugega:
- Vtičnik za preusmeritve. Najpogostejši vzrok so vtičniki, ki "vse 404 preusmerijo na domačo stran". Preglejte Plugins → Installed Plugins in poiščite takega, ki ima 404 ali redirect v imenu ali opisu. V vtičnikih za preusmeritve poiščite možnost, ki preusmeri vsak 404, in jo izklopite. Preusmeritve za posamezne stare naslove obdržite.
- Tema. Odprite
404.phpv temi. Če kličewp_redirect()aliwp_safe_redirect(), tema obiskovalce pošlje drugam. V podrejeni temi404.phpnadomestite z različico brez preusmeritve. - Permalinki. Če manjkajoče strani pokažejo domačo stran sploh brez preusmeritve, odprite Settings → Permalinks in kliknite Save Changes, ne da bi kaj spremenili. To na novo zapiše pravila v
.htaccess.
Če ste stran 404 oblikovali z graditeljem strani (na primer s predlogo Elementor Theme Builder), status ostane 404; spremeni se samo videz.
Nato počistite predpomnilnik strani: nekateri vtičniki za predpomnjenje lahko mehki 404 shranijo kot običajno stran.
nginx
Poglejte blok server { … } za stran: /etc/nginx/sites-available/example.com na Debianu in Ubuntuju, /etc/nginx/conf.d/example.com.conf na Rocky, Alma in CentOS.
Statična stran. Zadnji element v try_files odloči, kaj se zgodi z neznanim naslovom. Naj bo =404, lastno stran pa pokažite z error_page:
location / {
try_files $uri $uri/ =404;
}
error_page 404 /404.html;
location = /404.html {
internal;
}
Tri različice povzročijo mehki 404:
try_files $uri $uri/ /index.html;za vsak naslov postreže domačo stran s 200. To je običajna nastavitev za aplikacijo na eni strani (SPA); kaj storiti v tem primeru, piše v zavihku Node.js in Next.js.error_page 404 = /index.html;z=status 404 zamenja s statusom strani, ki jo postreže (200). Izpustite=.error_page 404 https://example.com/;s celim URL-jem pošlje preusmeritev. Uporabite lokalno pot.
Aplikacije PHP (WordPress, Laravel) uporabljajo try_files $uri $uri/ /index.php?$args;. To je pravilno: odloči aplikacija in sama vrne 404.
Preizkusite in uveljavite:
sudo nginx -t && sudo systemctl reload nginx
Apache in LiteSpeed
V .htaccess v korenski mapi strani (ali v virtualnem gostitelju na lastnem strežniku) za stran z napako uporabite lokalno pot:
ErrorDocument 404 /404.html
S celim URL-jem (ErrorDocument 404 https://example.com/404.html) Apache namesto statusa 404 pošlje preusmeritev na to stran in obiskovalec konča na strani z napako, ki odgovori z 200.
Dve drugi vrstici povzročita mehki 404 na statičnih straneh in aplikacijah na eni strani:
# Vsak neznan naslov dobi index.html s statusom 200:
FallbackResource /index.html
RewriteRule . /index.html [L]
Na statični strani ju odstranite. Za aplikacijo na eni strani glejte zavihek Node.js in Next.js.
Na lastnem strežniku preizkusite in uveljavite:
sudo apachectl configtest && sudo systemctl reload apache2
(httpd namesto apache2 na Rocky, Alma in CentOS. Spremembe v .htaccess veljajo takoj.)
Node.js in Next.js
Next.js, App Router. Vaš app/not-found.tsx se pošlje s statusom 404, kadar se ne ujema nobena pot. Pri dinamičnih poteh ([slug], [...slug]) morate to povedati sami, kadar ni ničesar za prikaz; sicer se stran izriše prazna s 200:
import { notFound } from 'next/navigation';
export default async function Page({ params }) {
const { slug } = await params;
const post = await getPost(slug);
if (!post) {
notFound();
}
return <Article post={post} />;
}
Next.js, Pages Router. Iz getStaticProps ali getServerSideProps vrnite { notFound: true }; Next.js nato postreže pages/404.js s 404.
Express. Za vsemi potmi dodajte obdelovalec:
app.use((req, res) => {
res.status(404).sendFile(path.join(__dirname, 'public', '404.html'));
});
Aplikacije na eni strani brez strežnika (React, Vue ali Angular, zgrajeni v statične datoteke). Strežnik za vsak naslov pošlje index.html in samo brskalnik ve, da pot ne obstaja, zato je status vedno 200. Pravi popravki so na strežniku: strani izrišite ali vnaprej izrišite (Next.js, Nuxt, Astro, korak predizrisa) ali pa spletnemu strežniku dajte seznam pravih poti in za ostale vrnite 404. Do takrat pogledu "ni najdeno" dodajte vsaj <meta name="robots" content="noindex">, da Google teh naslovov ne obdrži.
Laravel
Laravel vrne 404, kadar se ne ujema nobena pot, in pokaže resources/views/errors/404.blade.php, če ga imate, s statusom vred. Mehki 404 pride iz kode, ki ujame vse:
// Mehki 404: rezervna pot, ki vrne stran s statusom 200.
Route::fallback(fn () => view('home'));
// Pravilno: rezervno pot obdržite, a odgovorite s 404.
Route::fallback(fn () => response()->view('errors.404', [], 404));
V kontrolerjih uporabite findOrFail() ali abort(404), kadar zapis ne obstaja, namesto da vrnete pogled s praznim stanjem:
$post = Post::where('slug', $slug)->firstOrFail();
Cloudflare
Cloudflare Pages. Če objavljene datoteke na vrhu nimajo 404.html, Pages projekt obravnava kot aplikacijo na eni strani in za vsak neznan naslov postreže index.html s 200. Izhodu gradnje dodajte 404.html in Pages ga bo poslal s statusom 404.
Workers s statičnimi datotekami. V konfiguraciji Wrangler ima not_found_handling = "single-page-application" enak učinek. Za stran, ki ni aplikacija na eni strani, uporabite "404-page".
Pravila za preusmeritve. Če neznani naslovi končajo na domači strani, v nadzorni plošči domene pod Rules poiščite pravilo za preusmeritev ali Page Rule z nadomestnim znakom, ki vse pošlje na /. Omejite ga na stare naslove, za katere je bilo mišljeno.
IIS in ASP.NET
V web.config stran po meri postrezite namesto napake, ne kot preusmeritev:
<configuration>
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" />
<error statusCode="404" path="/404.html" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
</configuration>
responseMode="Redirect" pošlje 302 na stran z napako, ta pa odgovori z 200. Starejša nastavitev ASP.NET <customErrors> privzeto naredi enako; če jo uporabljate, nastavite redirectMode="ResponseRewrite".
Statični HTML
Statična gostovanja poiščejo datoteko 404.html in jo pošljejo s statusom 404: Netlify, GitHub Pages, Cloudflare Pages in večina drugih. Eno postavite v koren strani.
Na Netlifyju pravilo, ki ujame vse, v _redirects ali netlify.toml vsak neznan naslov spremeni v domačo stran s 200:
/* /index.html 200
Odstranite ga, razen če je stran aplikacija na eni strani. Na običajnem deljenem gostovanju uporabite zavihek Apache in LiteSpeed.
Gostovane platforme
Shopify, Wix, Squarespace in Webflow za manjkajoče strani vrnejo pravi 404 in vam pustijo oblikovati stran 404. Če preverjanje tam vseeno ne uspe, poiščite preusmeritev: aplikacijo Shopify, ki preusmerja 404, pravilo z nadomestnim znakom med preusmeritvami 301 v Webflowu ali preusmeritev URL-jev v Wixu ali Squarespaceu, ki celo pot pošlje na domačo stran.
Potrdite popravek
Znova poženite oba ukaza curl iz razdelka Preverite sami, nato v PulseKeeperju odprite tarčo in na zavihku Kontrolni seznam kliknite Preveri zdaj. Postavka se v nekaj minutah obarva OK, ne šele ob naslednjem dnevnem preverjanju.