Az oldalaink folyamatosan változnak, bejegyzéseket törlünk, nevezünk át. Ekkor jön jól a 301-es átirányítás.
Nagyobb oldalak, blogok, fórumok esetében sűrűn előfodul, hogy egy-egy bejegyzést, hírt vagy hozzászólást törlünk, inaktiválunk vagy átnevezünk. Ilyenkor, ha nem akarjuk, hogy felhasználóink és a google barátunk is egy hiba üzenettel, esetleg egy üres oldallal találkozzon, kénytelenek vagyunk a nem létező tartalmat egy létezőre irányítani.
Régebben felmerült bennem az öltet, ha már az admin felületem úgyis naplózza mikor mit teszek az oldalon, lehet jobban járnék, ha ezt felhasználnám erre a célra. Csinálnék egy scriptet, ami ha egy halott linket talál, azonnal képes eldönteni, hogy hová irányítsa a felhasználót. Ha a link törölve lett, ésszerű, ha egy szinttel feljebb irányítom a látogatókat, de ha átneveztem akkor simán dobjon az új linkre.
Az átirányítást mindenképp egy php scripttel oldanám meg, 301-es headerrel. Ennek régen használt menete:
header ('HTTP/1.1 301 Moved Permanently');
header ('Location: '.$location);
ahol a $location
tartalmazza az átirányítás pontos helyét.
Kicsit utána olvasgattam, találtam pár érdekességet is. Például van egy rövidebb megoldás is, de ezzel is lehetnek gondok. Sokan ajánlják a következő formátumot:
header("Location: ".$location, true, 301);
Nem rossz. Rövidebb és egyszerűbb. DE. A fránya de. Mindig van de.
Tehát, ha FastCGI van a szerveren, akkor gondok lehetnek ezzel a technikával Chrome alatt (vagy akár más böngészőknél is). Miért is? A FastCGI 200-as státuszkóddal tér vissza, ami miatt a Chrome, hiába van redirect, nem végzi el az átirányítást.
Ennek kiküszöbölésére külön küldenünk kell egy status kódot is a FastCGInek, ami a fejlécbe külön nem kerül be, de ott lesz az első sorában:
header("Status: 301");
header("Location: ".$location, true, 301);
Így tök mindegy melyiket használjuk, én személy szerint a legelsőt szoktam alkalmazni.
Néhány szintén hasznos dolog, amit jó, ha tudsz, mikor header()
-rel akarsz átirányítást végrehajtani.
Nem lehet előtte más kimenet, még egy szóköz sem, ha mégsem irányítana át, nézd meg a hibalogot, előfordulhat, hogy maradt valahol egy fránya karakter vagy egyéb kimenet, mely megakadályozza a header elküldését. A hiba logban keress egy ilyet: “headers already sent …”
Ha találtál, gond van. Ellenőrizd végig, hogy a programodban nincs véletlenül se valamilyen kimenet.
Másik megoldásként általában az ob_start()
és ob_end_flush()
-t szoktam használni, mely buffereli a kimenetet, így csak a program futás végén kapja meg a kimenetet, ezáltal a kód bármely részén van a header(), mindig végrehajtódik.
Van még egy másik apróság, ami szintén hajtépéshez vezethet. Néha túlszalad a program a header()
-ön, kellemetlen perceket tud okozni. Ezért érdemes egy exit;
vagy die();
sort is beiktatni a redirect után.
header("Status: 301");
header("Location: ".$location, true, 301);
die();
így már tutira meg fog állni és átirányít. Persze ekkor is él a szabály, hogy ne legyen kimenet a header()
előtt…
Utószóként pedig csak annyit, hogy google szempontjából mindig a header()
átirányítás lesz érvényes, figyelmen kivül fogja hagyni a meta és a javascript átirányításokat is. Tehát ha a keresőből linket akarunk kiölni, vagy másik oldalra akarjuk terelni a felhasználóinkat, mindig érdemes a header()
-t használni.