ugrás a tartalomhoz

htaccess hiba - nem szabványos 404 hibaoldal

mz82 · 2016. Szep. 14. (Sze), 07.47
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!

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]
 
1

És milyen választ adsz az

Poetro · 2016. Szep. 14. (Sze), 09.23
É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?
2

Végülis nem titok, próbáld ki

mz82 · 2016. Szep. 14. (Sze), 09.54
Végülis nem titok, próbáld ki példákkal:

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]
3

Csak emlékeztetőnek írom

mz82 · 2016. Szep. 14. (Sze), 12.22
Csak emlékeztetőnek írom újra, hogy ha a RewriteRule sort kihagyom, akkor már nem jelentkezik a "Nem szabványos 404-es oldal" hiba.

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.
4

404

Hidvégi Gábor · 2016. Szep. 14. (Sze), 14.10
Lehet, az a bajuk a SEO-s oldalaknak, hogy a nem létező oldalaid is 200-as HTTP válaszkódot adnak, nem 404-et.

header('HTTP/1.0 404 Not Found');
5

Szerintem nem ez a gond. Az

mz82 · 2016. Szep. 14. (Sze), 15.16
Szerintem nem ez a gond. Az index.php-m elején ott ez a kódrészlet:

$menu = filter_input(INPUT_GET, 'menu');

if ($menu == '404-error'){
    header('HTTP/1.0 404 Not Found');
}
De akár ott van, akár nem, ha chrome-ban fejlesztői eszközöknél megnézem a Network forgalmat, akkor látszik, hogy 404-es statuskód a válasz például erre a lekérdezésre:
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?
6

Ha utánajártál volna annak,

Endyl · 2016. Szep. 14. (Sze), 17.29
Ha utánajártál volna annak, amit Poetro írt az első válaszban, akkor láthatnád, hogy arra bizony 200-as kódot ad vissza az oldalad. Azt nem tudom, hogy ezért adnak-e rossz pontot az eszközök, amiket nézel.

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/).
7

Szerintem elég egyértelmű,

mz82 · 2016. Szep. 14. (Sze), 20.18
Szerintem elég egyértelmű, hogy már utánajártam annak, amit Poetro írt. A válaszomat azért fejtettem ki bővebben, hátha további ötletet adok a hibám megoldásához. Nem igazán értem minek kötekedsz.
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!
8

GET

Poetro · 2016. Szep. 14. (Sze), 21.04
GET /index.php?menu=biztosan-nem-talalhato-123456 HTTP/1.1
Host: biborordog.hu
HTTP/1.1 200 OK
Na ezért nem jelzik 404-esnek.
9

Már értem, hogy mit nem

mz82 · 2016. Szep. 14. (Sze), 22.14
Már értem, hogy mit nem sikerül jól leírnom.

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.
10

Az a probléma, hogy akár

Poetro · 2016. Szep. 15. (Cs), 08.35
Az a probléma, hogy akár melyik oldal 200-as válasszal tér vissza.
http://biborordog.hu/biztosan-nem-talalhato-123456 is, pedig ekkor illene 404-es választ adni, és PHP-ban meg is tudod tenni. Az, hogy kiírod, hogy A keresett oldal nem található! nem 404-es válasz.
11

Nincs igazad, mert

mz82 · 2016. Szep. 15. (Cs), 09.49
Nincs igazad, mert a
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!
12

Nézd át a teljes apache

Endyl · 2016. Szep. 15. (Cs), 11.13
Nézd át a teljes apache configodat, kapcsold be az átírás logolását egy időre és nézd meg mi történik, mert valami nem kerek abban, ahogy látszólág működik az oldalad ebből a szempontból.

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.
13

Köszi, a tesztelési úton el

mz82 · 2016. Szep. 15. (Cs), 11.43
Köszi, a tesztelési úton el is fogok indulni. Én is úgy érzem, hogy valami kavarodás van a rendszeremben, ezért kértem segítséget.

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. :-)
14

Szerintem a "ha az erőforrás

Endyl · 2016. Szep. 15. (Cs), 11.56
Szerintem a "ha az erőforrás nem érhető el" egyenértékű azzal, hogy "a portálmotor nem talál egy cikket". Az a klienst a legkevésbé sem érdekli, hogy egy kérést mi szolgál ki (valós fájl vagy sem). Ő kért egy cikket, és ha nincs olyan cikk, akkor azt illik válaszolni, hogy 404.
15

Csak filozofálok, de esetleg:

mz82 · 2016. Szep. 15. (Cs), 12.20
Csak filozofálok, de esetleg: 204 - No content?
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.
16

Ne gondolkodj fájlokban.

Endyl · 2016. Szep. 15. (Cs), 13.14
Ne gondolkodj fájlokban. URL-ek (Uniform Resource Locatorok) vannak. Ha egy URL egy cikkre vonatkozik -mint erőforrás-, akkor ha nem létezik az adott cikk az adott kliens számára, akkor a válasz 404. Ebből következik, hogy a szerver megkapta és megértette, feldolgozta a kérést, de nincs olyan erőforrás.
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.
17

Így van,

Pepita · 2016. Szep. 15. (Cs), 18.03
Ez helyes 404 definíció, érdemes követni.

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.