301-es átirányítás PHP header() segítségével

img

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.