Autor Zpráva
Michal Štěpánek
Profil
Dobrý den,

rád bych se zeptal na správnou funkčnost 404 stránky, která se generuje v CMS. Narazil jsem na tento možná ano možná ne problém.

Pokud uživatel zadá neexistující stránku, nebo klikne na odkaz ve výsledku vyhledávání na url stránku, která byla permanentně smazaná ze struktury webu, url se přesměruje na /stranka-nenalezena, tato stránka má sice HTTP status code 404, ale nemělo by to url zůstat stejné, např./odstranena-stranka a zde mít HTTP status code 404?

Možná řeším kravinu, ale nikde jsem nenašel odpověď jestli to je takto v pořádku z pohledu vyhledávače, z pohledu uživatele určitě.

Vím, že by se stránky neměly nikdy mazat, ale když už není zbytí, rád bych, aby to bylo provedeno co nejšetrněji.

Moc děkuji předem za odpověď.
janbarasek
Profil
Michal Štěpánek:
Pokud stránka nebude fungovat delší dobu, tak se toho roboti všimnou a ve vyhledávání na ní nebude odkaz. Pokud to je aspoň trochu možné, tak je fain přesměrovat uživatele na novou adresu stránky. Dále je také důležité zajistit, aby na původní stránku vedlo co nejméně odkazů (ideálně žádné).

Já osobně bych vracel odpověď 410, která říká: "Tady už nic nehledej, tady už nikdy nic nebude". Roboti to většinou pak smažou hned z indexu.

Něco jsem o tom našel i jinde.
Chamurappi
Profil
Reaguji na Michala Štěpánka:
url se přesměruje na /stranka-nenalezena
Proč? Přesměrovávat na chybovou stránku je zvěrstvo, uživatel ztratí původní adresu.

jestli to je takto v pořádku z pohledu vyhledávače
Vyhledávači to nejspíš bude skoro jedno, tak či tak pozná, že starý obsah zanikl.
Michal Štěpánek
Profil
Děkuji za jasné odpovědi.

Chamurappi:
Proč? Přesměrovávat na chybovou stránku je zvěrstvo, uživatel ztratí původní adresu.
Ta původní je smazaná, čili původní url je mu stejně k ničemu. Ale je mi jasné, že nejlepší řešení je přesměrovat uživatele na novou relevantní stránku.

janbarasek
Já osobně bych vracel odpověď 410, která říká: "Tady už nic nehledej, tady už nikdy nic nebude". Roboti to většinou pak smažou hned z indexu.
Přesně tohle potřebuji, díky!
Martin Kolčaba
Profil
vyhledávači je to celkem jedno, v obou případech dostává informaci, že stránka na dané URL neexistuje. Jen ji jednou dostane přímo, podruhé přes přesměrování.

Ale jak píše Chamurappi, z uživatelského pohledu je vhodnější, když 404 hlásí skutečně chybná adresa, jako např. na http://www.mall.cz/daff. Uživatel tak má možnost zkontrolovat, co je špatně, což třeba u http://www.alza.cz/safsdf nemá, i když mu Alza paradoxně radí, ať si adresu, kterou přesměrováním ztratil, zkontroluje.
juriad
Profil
Michal Štěpánek:
Nepřesměrovávej, ale rovnou zobraz alternativní stránku - tu, kam bys přesměroval.
Tím zachováš status 410 - robot pochopí, že stránka již neexistuje, ale uživatel uvidí přínosný obsah.
Michal Štěpánek
Profil
Martin Kolčaba:
...což třeba u http://www.alza.cz/safsdf nemá, i když mu Alza paradoxně radí, ať si adresu, kterou přesměrováním ztratil, zkontroluje.
Jo, to je přesně to co mi nedává logiku. Na základě toho jsem to začal řešit. Díky!
Bubák
Profil
Koukám, že v pořádku není ani http://www.mall.cz/daff ani http://www.alza.cz/safsdf.
http://www.mall.cz/daffHTTP/1.1 500 Internal Server Error

http://www.alza.cz/safsdf má v hlavičce HTTP/1.1 302 Redirect na Location: http://www.alza.cz/Error404.aspx
http://www.alza.cz/Error404.aspx má v hlavičce HTTP/1.1 200 OK
Je to krásná ukázka falešné 404 stránky.
Joker
Profil
Michal Štěpánek:
Ta původní je smazaná, čili původní url je mu stejně k ničemu.
Nemusí být.
Přesměrování je opravdu „bezva“ v situaci, kdy návštěvník opisuje adresu třeba z papíru, upíše se v jednom písmenku, web ho přesměruje někam do pryč a může opisovat znovu (resp. ani neví, jestli se upsal, nebo adresu napsal správně, ale stránka už je smazaná).

Jinak Alza je koukám ukázka toho, jak se to nemá dělat.
Návštěvníkovi vrátí 302 a přesměruje ho na stránku, která vrátí 200, ačkoliv tvrdí, že je 404. A poradí mu si zkontrolovat adresu, kterou mu ovšem tím přesměrováním zahodila.
Martin Kolčaba
Profil
Bubák:
Koukám, že v pořádku není ani http://www.mall.cz/daff ani http://www.alza.cz/safsdf.
http://www.mall.cz/daff má HTTP/1.1 500 Internal Server Error

hm, pravda, tak to jsem je trochu přechválil - aspoň v tomhle jsem jim věřil a nekontroloval, jestli stránky vrací 404 :)
Milkys
Profil
Přiložím zde na téma 404.
Pokud mi např. produkt resp. stránka zanikne přesměrovávám okamžitě uživatele na nadřazenou kategorii. Držel jsem se pravidla: conejméně 404 stránek - je lepší žádná. Pro uživatele asi nejpřirozenější než číst nějakou 404 stránku, to jsem si myslel než jsem si přečetl tento povedený článek.
Věc druhá.
Problém je asi i v tom, že neposílám kod 404. Potom jsem četl i o soft 404 a mám obavy zda nedělám skutečně nevědomě něco nekalého vůči botům.
Rád bych Vás proto požádal o názory?

Pokud url neexistuje, v hlavičce mám toto:
header("HTTP/1.1 301 Moved Permanently");
header("Location: $prvni_stranka");
header("Connection: close");

V případě, že budu chtít zachovat přesměrování na nadřazenou kategorii - tam problém nemám, alespoň ne funkční.
Zároveň poslat 404 botovi o neexistující stránce (url neexistující stránky si zjistit umím) - tam asi problém mám. Zároveň tak ošetřit "soft 404"
Dělá se to takhle?
header("HTTP/1.1 404 Not Found");
header("HTTP/1.1 301 Moved Permanently");
header("Location: url_nadrazene_kategorie");
header("Connection: close");
Děkuji za reakce.
Joker
Profil
Milkys:
Nepřipadá mi dobré přesměrovat uživatele někam, kam původně nechtěl.

Držel jsem se pravidla: conejméně 404 stránek - je lepší žádná. Pro uživatele asi nejpřirozenější než číst nějakou 404 stránku, to jsem si myslel
S tím bych nesouhlasil (Vy už teď asi taky ne).
Uživatel myslím víc ocení číst nějakou 404 stránku (hlavně když je dobře udělaná, sdělí mu, že hledaný obsah neexistuje, nabídne alternativy a případně vyhledávání), než bez varování skončit na jiné stránce (v nejhorším případě na hlavní stránce webu).

Tady jak jsem Alzu výše zmínil jako příklad jak nedělat 404, vyřazené produkty mají naopak udělané výborně.
Milkys
Profil
Joker:
S tím bych nesouhlasil (Vy už teď asi taky ne). Máte TRUE.

Pro uživatele: nechat neexistující url, nepřesměrovávat. Zobrazit pod touto url "speciální" obsah kde si sám zvolí kam jít.
Pro bota:
header("HTTP/1.1 404 Not Found");
header("Connection: close");

Bude to tak správně?
juriad
Profil
Zkusím to povědět jinak:

Server posílá v odpovědi dvě důležité věci:
- hlavičku se statusem,
- html stránku.

Hlavička se skládá z verze HTTP protokolu, stavového kódu a stavové hlášky.
- Protokol se dnes používá jen HTTP/1.1
- HTTP kód podle první cifry určuje, zda požadavek byl úspěšný (2xx), neúspěšný (4xx), způsobil chybu (5xx), nebo požadovaná data jsou jinde (3xx)
- Na stavové hlášce nezáleží; kdokoli si tam může napsat cokoli a nikdo se tím neřídí; obvykle se používá přímo jméno stavu.

Odeslání HTML stránky v odpovědi je nepovinné, ale je možné ve všech případech. V případě přesměrování se však nikde v prohlížeči nezobrazí (není na její zobrazení čas). V ostatních případech se stránka zobrazí. Nevím, jak se chová historie prohlížeče ke stránkám s jiným kódem než 2xx; nevím ani, jak se k nim chovají proxy a další zvěř.
Pokud žádnou stránku nepošleš, prohlížeč zobrazí nějakou svou výchozí (pro kód 2xx je to obvykle prázdná, pro 4xx a 5xx je to stránka se stručným vysvětlením chyby).

Na základě výše uvedených informací bys měl v případě neexistující stránky poslat kód 4xx a zobrazit nějakou stránku, která je pro uživatele přínosná.
Může to klidně být stránka kategorie, ve které se produkt nacházel, může to být prostá hláška: „Zkontroluj si adresu“, může to být i úvodní stránka webu.
Důležité je, že adresa zůstane zachovaná (nepřesměruješ) a stavový kód je jiný než úspěšný (2xx).

Důležité je, že robot pochopí, že stránka sice neexistuje (odstraní si ji z indexu), ale nabízíš nějakou alternativu. Předpokládám, že tuto stránku bude indexovat, ale bude dost penalizovaná.
Amunak
Profil
Milkys:
Nerozlišuj uživatele a roboty. Proč posíláš connection: close?

Když stránka neexistuje, pošli jen header("HTTP/1.1 404 Not Found");. Na stránce pak vypiš něco užitečného pro uživatele - kam jít dál apod.

Když stránka zanikla (např. byla smazaná jako vlákno na nějakém fóru, nebo něco podobného), posílej header("HTTP/1.0 410 Gone");.

Pokud jde o vyřazený produkt, nebo nějakou obdobu - tedy stránka existuje, pořád na ní jsou relativně užitečné informace, ale je nějakým způsobem neaktuální nebo nepříliš hodnotná, neposílej nic (tedy 200), a jen na stránku uveď, jak to s ní je (tedy vypršela platnost nabídky, produkt byl vyřazen, informace o nějaké akci co už se stala jsou zastaralé apod.)

Tehdy a jen tehdy, když se permanentně změnila adresa, posíláš
header("HTTP/1.1 301 Moved Permanently");
header("Location: /nova-stranka");

Někdy je vhodné o tom, že byl uživatel potichu přesměrován, informovat na té nové stránce.
Milkys
Profil
juriad, Amunak:
Chlapi, vyčerpávající, rozumím - děkuji.
Chamurappi
Profil
Reaguji na juriada:
HTTP kód podle první cifry určuje, zda požadavek byl úspěšný (2xx), neúspěšný (4xx), způsobil chybu (5xx)
Ještě bych upřesnil, že čtyřstovkové chyby značí chybu klienta a pětistovkové chybu serveru. Takže když server úmyslně přesměrovává klienta na jinou svojí adresu, která vrací 404 (jak se řešilo výše), je to takový stavový protimluv :-)

Vaše odpověď

Mohlo by se hodit

Zajímavé čtení:
Poptávání výměny odkazů je na této diskusi nežádoucí.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: