htaccess hiba - nem szabványos 404 hibaoldal
Mi okozhatja, hogy ha a .htaccess fájlban beállítok egyedi 404-es hibaoldalt, akkor az jól megjelenik, viszont SEO teszterek (Woorank, Seoceros) azt írják, hogy nincs szabványos 404-es oldalam (500-as hibakódot jeleznek).
Alább látható a .htaccess fájlom tartalma. Ha eltávolítom a
RewriteRule ^([^/]+)$ /index.php?menu=$1 [NC,QSA,L]
sort a fájlból, akkor már szabványosnak jelzik a 404-es oldalt, csak nyilván nem tudok felhasználóbarát url-eket használni.
Elég elterjedt lehet a hiba, mivel az általam véletlenszerűen kipróbált oldalak nagy részénél jeleznek ilyen hibát a fenti validátorok.
Minden segítséget, ötletet előre is köszönök!
■ Alább látható a .htaccess fájlom tartalma. Ha eltávolítom a
RewriteRule ^([^/]+)$ /index.php?menu=$1 [NC,QSA,L]
sort a fájlból, akkor már szabványosnak jelzik a 404-es oldalt, csak nyilván nem tudok felhasználóbarát url-eket használni.
Elég elterjedt lehet a hiba, mivel az általam véletlenszerűen kipróbált oldalak nagy részénél jeleznek ilyen hibát a fenti validátorok.
Minden segítséget, ötletet előre is köszönök!
IndexIgnore *
ErrorDocument 404 /index.php?menu=404-error
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ /index.php?menu=$1 [NC,QSA,L]
RewriteCond %{HTTP_HOST} ^www\.mysite\.hu [NC]
RewriteRule ^(.*)$ http://mysite.hu/$1 [L,R=301]
ErrorDocument 404 /index.php?menu=404-error
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ /index.php?menu=$1 [NC,QSA,L]
RewriteCond %{HTTP_HOST} ^www\.mysite\.hu [NC]
RewriteRule ^(.*)$ http://mysite.hu/$1 [L,R=301]
És milyen választ adsz az
index.php
-ban, amikor olyan oldalra érkezik a felhasználó, ami nem található, például/index.php?menu=biztosan-nem-talalhato-123456
?Végülis nem titok, próbáld ki
ha a keresett oldal létezik:
http://biborordog.hu/index.php?menu=modern-tapeta
ha a motor nem találja a paraméternek adott értéket:
biborordog.hu/index.php?menu=biztosan-nem-talalhato-123456
ez pedig 404 esetre lenne példa:
biborordog.hu/index.php?menu=biztosan-nem-talalhato-123456.xxx
(a böngésző is szépen 404-es kódot jelez vissza)
Szóval minden tökjó, csak az a fránya seo mondja hogy nincs 404-es oldalam:
https://seoceros.com/en/biborordog.hu
Nekem ez magas!
A .htaccess-ben közben javítottam egy sort:
ebből:
RewriteRule ^([^/]+)$ /index.php?menu=$1 [NC,QSA,L]
ez lett:
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?menu=$1 [NC,QSA,L]
Csak emlékeztetőnek írom
Mit kavarhat meg ez az utasítás?
Esetleg ki lehetne valamivel váltani?
Próbáltam az ErrorDocument és a RewriteRule együttes használatára vonatkozóan hibajelenségeket keresni, de a legtöbb helyen csak a helytelen útvonalhasználattal tökölnek. Nálam meg minden műküdik, csak a téves 500-as hibakódot nem értem.
404
Szerintem nem ez a gond. Az
http://biborordog.hu/modern-tapeta1234.dd
Még mindig azt gondolom, hogy a RewriteRule csinál valami rosszat. Ha az nincs, hirtelen rendben lesz a 404 status kód a seo validátorokban is.
Nincs valami ciklus, újrahívás, amit nem veszek észre?
Ha utánajártál volna annak,
Továbbá, ha minden kérést úgyis átírsz az index.php-re, akkor amíg működik a mod_rewrite, kétlem, hogy eljutna a feldolgozás az ErrorDocument direktívához. Vagyis jobban megnézve, valamiért (gondolom, ha a RewriteRule nem illeszkedik) akkor jut el az ErrorDocument direktívához, ha az url path részében van perjel, vagy ha az nincs, akkor ha pont van benne, egyébként meg 200-as kódot ad az oldal. És ha perjel van a pathban, akkor teljesen szétesik az oldal (pl.: http://biborordog.hu/asdf/).
Szerintem elég egyértelmű,
Nem tudom miből következtettél arra, hogy nem működik az ErrorDocument, amikor ugyanott írom, milyen lekérdezésekre mi a válasz. Olvastad a 2. hozzászólást?
A legutolsó mondatodnak van értelme, köszönöm hogy észrevetted, javítom!
Továbbra sem értem, hogy miért jelzik a validátorok a 404-es oldalam (amit a böngésző és 404-es statusnak érzékel) nem szabványosnak.
Ha valakinek van ötlete köszönöm a segítséget!
GET
Már értem, hogy mit nem
A 2. hozzászólásomban leírtam 3 lekérdezést, amik valóban 200-as status code-al térnek vissza:
1. http://biborordog.hu/index.php?menu=modern-tapeta
2. http://biborordog.hu/index.php?menu=biztosan-nem-talalhato-123456
3. http://biborordog.hu/index.php?menu=biztosan-nem-talalhato-123456.xxx
Ez normális is, hiszen az index.php létezik.
404-es hiba akkor jön létre, ha a keresett fájl nem található, például ilyenkor:
http://biborordog.hu/biztosan-nem-talalhato-123456.xxx
Ezt a kérést az oldal helyesen lekezeli, megjeleníti az egyedi 404-es hibaoldalt és 404-es státuszt is ad vissza. De a seo-s validátorok mégsem szabványosnak érzékelik. (Woorank - status code 500)
A RewriteRule miatt a 404-es hibaoldalamat szintén az index.php generálja és ezen az url-en közvetlenül is elérhető:
http://biborordog.hu/?menu=404-error
A hibakeresés miatt próbáltam teljesen statikus html oldalt megadni 404 hibaoldalnak, de ha a RewriteRule sor bent van a htaccess-ben akkor ugyanúgy megmarad a hiba.
Sajnos csak ismételni tudom, hogy szerintem a RewriteRule okozza a galibát, de nem tudom megérteni miért. És igazából ez zavar, mert az oldal működését ez a jelenség egyáltalán nem befolyásolja.
Az a probléma, hogy akár
http://biborordog.hu/biztosan-nem-talalhato-123456
is, pedig ekkor illene404
-es választ adni, és PHP-ban meg is tudod tenni. Az, hogy kiírod, hogyA keresett oldal nem található!
nem 404-es válasz.Nincs igazad, mert
http://biborordog.hu/biztosan-nem-talalhato-123456.xxx
lekérdezés a kezdetek kezdete óta 404-es kóddal és egyedi hibaoldallal tér vissza. De elfáradtam magyarázni, valószínűleg nem értem a .htaccess használatát.
A hibát megoldottam, de még mindig nem sikerült megértetnem mit szerettem volna.
Én azt gondoltam, hogy a
http://biborordog.hu/biztosan-nem-talalhato-123456
lekérdezésre nem kell 404-es hibát jeleznem. Mivel ez átalakul ezzé:
http://biborordog.hu/index.php?menu=biztosan-nem-talalhato-123456
Ezt a lekérdezést pedig le tudom kezelni, úgy hogy a keresett cikk a weboldalon nem található, de az oldal motorja erre valódi választ (200) tud adni.
Ha viszont valaki a
http://biborordog.hu/biztosan-nem-talalhato-123456.jpgvagyakarmi
fájlt akarja elérni, akkor arra már 404-es hibát és egyedi hibaoldalt dobok vissza.
Ez szerintem azért lehetséges, mert a htaccessben ott ez a sor:
RewriteCond %{REQUEST_FILENAME} !-f
Tehát fájlok esetében (a pont miatt) nem történik meg az átirányítás és nem lesz belőle ez:
http://biborordog.hu/index.php?menu=biztosan-nem-talalhato-123456.jpgvagyakarmi
Nevetséges, de úgy tűnik a validátornál valahogy mégis létrejön ez az url. Ezért most beletettem a motorba, hogy ha olyan cikket keres valaki az adatbázisban ami nincs, akkor 404-es fejlécet generáljon az oldalnak.
Ez most azzal jár hogy ez a két link eltérő tartalmat jelenít meg:
http://biborordog.hu/?menu=biztosan-nem-talalhato-123456.xxx
http://biborordog.hu/biztosan-nem-talalhato-123456.xxx
A validátorok így már jól látják a 404-es kódot.
Ha valaki érti magyarázza meg!
Nézd át a teljes apache
Kipróbáltam saját gépen a fenti beállítást, és ahogy az következik a fenti szabályokból, az ErrorDocument direktívához nem jut el soha a kérés, hacsak nem írok be olyan url-t, amire nem illeszkedik a RewriteRule mintája. Azaz, amíg nincs perjel a pathban, addig az ErrorDocumentet ki is vehetném, mert a RewriteCondok értelmében, ha az apache nem létező fájlt vagy mappát talál, akkor azt átírja az index.php-re, ami létezik, és így nem fog az ErrorDocumentre futni. Nálad viszont látszólag valamiért mégis az ErrorDocumentre fut (vagy az index.php-ben kezeled máshogy azt a menu paramétert, amiben pont van), ha a path formailag ilyen: /valami.akarmi. Ennek nem kéne megtörténnie.
Egyébként sokkal tisztább lenne a történet, ha nem GET paraméterbe írnád át az eredeti kérést, hanem a REQUEST_URI-t kezelné az index.php (lásd janoszen posztját). Például nem kellene azzal törődnöd, hogy ugyanaz a tartalom van-e két oldalon (/akarmi.valami vagy /index.php?menu=akarmi.valami), mert csak egy url van.
Valamint hiába lázadsz ellene, 404-es kódot kell visszadni, ha a kliens olyan tartalmat kér, ami nem elérhető. Az lényegtelen, hogy ezt a döntést az Apache hozza meg, vagy kiveszed ezt a döntést az apache kezéből egy átírással és egy létező fájl a GET paraméterek alapján dönt. A lényeg, hogy ha a megadott tartalom nem található, akkor a status 404.
Köszi, a tesztelési úton el
Janoszen post-jában lévő technikát nem ismertem, de tetszik! Szerintem áttérek rá.
A 404-es kódot pedig eltérően fogjuk fel. Én úgy gondolom, hogy akkor kell 404-es kódra futni, ha az erőforrás nem érhető el (akár html, php, jpg vagy bármilyen fájl). Az hogy egy portálmotor nem talál egy cikket, szerintem nem ez a kategória. De ez talán az én hülyeségem. Amúgy az origo és a hvg is ilyen hibát dob, úgyhogy én is eléltem volna ezzel a teherrel. :-)
Szerintem a "ha az erőforrás
Csak filozofálok, de esetleg:
Az erőforrás elérhető, de a kért tartalom nem taláható.
De nyilván hagyom 404-en. Csak mindig azt hittem hogy ilyen hibakódot csak nem található fájl esetén adunk.
Ne gondolkodj fájlokban.
Ha konkrétan keresésről van szó, ami egy listát ad vissza a kérésnek megfelelő paraméterek alapján, de azokra a feltételekre nem illeszkedik egyetlen elem sem, akkor lehet visszaadni 200-as kódot, mert ott a resource maga a lista, amit elő tudsz állítani, csak éppen üres lesz.
Így van,
Annyit tennék hozzá, hogy az error document átirányítás szög egyszerűen is tesztelhető, ha nem index.php, hanem pl egy csodás statikus HTML oldal, amibe beírja, hogy "ez az error document".
De akár így, akár logot túrva mindig ellenőrizni kell a megadott beállításokat.
Szerk. : a létezik - e a fájl szabály szerintem nem is hasznos, mert pl egy config php -t nem valószínű, hogy magában ki akarsz szolgálni.
Ebből a szempontból nekem inkább tetszik, hogy egyes könyvtárak publikusak, ami nem ide irányuló request, az mind menjen index.php re. Majd ott eldől, hogy 404 v sem.