301 redirect met PHP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

G Jansma

G Jansma

23/11/2019 22:52:58
Quote Anchor link
Hallo,

Ik bezig met het verbeteren van de SEO en wil graag links van mijn website redirecten via 301. Omdat het er nogal veel zijn wil ik dit graag vanuit de MySQL database en via PHP afhandelen in plaats van via .htaccess.

Ik had een beetje rondgezocht en kwam uit bij het volgende. Mijn vraag is eigenlijk of onderstaande code in alle gevallen volstaat voor een 301 redirect? En of dit efficiënt is.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php

// Hier dan nagaan of de link omgeleid moet worden

http_response_code(301);
header('Location: /naar_pagina.php');
exit;

?>
 
PHP hulp

PHP hulp

24/11/2024 03:49:01
 
Rob Doemaarwat

Rob Doemaarwat

23/11/2019 23:14:52
Quote Anchor link
Je zou de 301 nog direct aan de header() toe kunnen voegen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
header('Location: /naar_pagina.php',true,301);
?>

Scheelt een regel. Zal qua tijd wel niet veel uitmaken.

Ik denk dat je meer winst kunt behalen bij "Hier dan nagaan of de link omgeleid moet worden". Vragen die dan bij me opkomen:
- hoe doe je je database lookup?
- om hoeveel pagina's gaat het precies?
- hoe dynamisch is de "redirect" data?
 
Thomas van den Heuvel

Thomas van den Heuvel

24/11/2019 00:17:56
Quote Anchor link
Een Location-header zou in ieder geval altijd gevolgd moeten worden door een exit-statement. Misschien is het om die reden verstandig om hier een functie of methode van te maken die dit alles combineert.

Heel strict genomen zou een Location-header ook een absolute URI moeten hebben, en geen relatieve. Ook uit oogpunt van (on)dubbelzinnigheid. Een absolute URI biedt geen ruimte voor alternatieve interpretaties.

En dan nog een SEO dingetje. Is de oude content ook echt niet meer beschikbaar? Anders krijg je misschien strafpunten voor "duplicate content".

Misschien is dit ook een goed moment om even een adempauze in te lassen? Als het echt nog allemaal losse PHP-scripts zijn zou je eens na kunnen gaan denken over een gecentraliseerde aanpak met één ingang naar je applicatie: index.php. En vervolgens zou je ook eens kunnen gaan kijken naar echte zoekmachine-vriendelijke URL's, waarbij je nagenoeg vrij bent in de naamgeving van je pagina's. Bezint eer gij begint?
 
G Jansma

G Jansma

24/11/2019 19:54:13
Quote Anchor link
Mijn tweede vraag ging zijn hoe ik dat het best vorm kan gaan geven. Maar een 301 redirect in PHP zoals in de code die ik postte (maar met absolute URI) is prima?

Het probleem is een beetje als volgt. Ik ben begonnen met pagina's als:

- /person.php?id=1&view=resultaten&jaar=2019

Nu heb ik de URL's opgeschoond, met een slug. En als canonical heb ik dan de nieuwe URL aangegeven.

- /person/michael-jordan/resultaten/2019/

Ik heb het wel zo gedaan dat de oude URL's nog werken. Maar ik denk dat het beter is om alle oude varianten met 301 door te linken naar de nieuwe versie? Daarnaast zijn er meerdere &view's (resultaten, historie, overzicht, ...), en meerdere jaren, dus het betreft per persoon wel een heel aantal links.

Het was misschien wat slordig, maar alle begin is lastig. Ik denk dat ik al wel flink wat strafpunten binnen heb, maar het is dan ook de bedoeling om dat te gaan verbeteren.

Ik ben er zelf nog niet helemaal uit hoe ik dit moet gaan vormgeven.

Ook komt het soms voor dat er 'dubbele' personen ontstaan. Dat bijvoorbeeld later blijkt dat michael-jordan en mike-jordan dezelfde persoon is. Dus dan zou ik alle pagina's met mike-jordan naar de juiste pagina van michael-jordan willen doorsturen. Liefst natuurlijk direct naar de juiste pagina. En daarnaast zou het het natuurlijk het mooiste zijn als hetzelfde gebeurt met de pagina's met de id van mike-jordan.


Ik had een beetje het volgende bedacht:
Is het een idee om de URL te controleren op de aanwezigheid van '.php?' voor de oude URL's, de parameters in de juiste volgorde te zetten, en te controleren of de in een speciale database table staan? En zo ja, doorsturen naar de aangegeven URL?

En als dat niet het geval is controleren of bv .../person/mike-jordan/.../ voorkomt in een andere (kleinere) table voor nieuwe en toekomstige verwijzigingen, of verandering van slug bijvoorbeeld?
 
Thomas van den Heuvel

Thomas van den Heuvel

24/11/2019 23:10:30
Quote Anchor link
Mja hiervoor wil je waarschijnlijk een soort van transitieperiode waarin je wordt doorgestuurd van oude locatie naar de nieuwe. Hiervoor zou je alle relevante pagina's door moeten "mappen" en het lijkt mij het makkelijkste om die in een tabel bij te houden.

Ik zou hierbij wel voor een makkelijke oplossing gaan. Dus een waarbij je niet allerlei "regels" programmeert (als het x.php is controleer a, als het y.php is controleer b etc.), maar gewoon volledige pagina-verwijzingen (REQUEST_URI's) en doelpagina's in die tabel gooien. Dus alleen maar een letterlijke mapping van oud naar nieuw. Het enige wat je dan hoeft te controleren is of de oude URL overeen komt met de huidige REQUEST_URI, zo ja redirect naar nieuwe pagina, zonee, ga door met normale afhandeling van de pagina-aanroep. Dit lijkt mij qua "flow" ook het makkelijkste - een URI/URL matcht wel of niet, en hoeft niet te worden berekend door allerlei code.

Je hebt dan wel wat werk aan het opstellen van alle mappings van oud naar nieuw en daarom is het zaak dat je heel goed nadenkt over de nieuwe naamgeving, en hoe je deze opbouwt, nog los van techniek (dus puur hoe URLs in de nieuwe situatie zijn opgebouwd). Je wilt namelijk deze exercitie niet nog tig keer uitvoeren :p.
Gewijzigd op 24/11/2019 23:11:52 door Thomas van den Heuvel
 
G Jansma

G Jansma

25/11/2019 19:53:27
Quote Anchor link
Ik denk wel dat het het beste zal zijn om eerst te controleren op de aanwezigheid van een ? in de URI (en eventueel nog wat eromheen), dat scheelt toch weer een onnodige zoekopdracht in de database. Ik weet nog niet precies hoeveel oude links dat exact gaan zijn, maar kan toch wel richting de 300.000 gaan. Gaat wel een flinke tabel worden dus die handeling vermijd ik dan liever. Maar die links kan ik op zich zo creëren en in een tabel zetten.

Maar ik ga er eerst nog even goed over nadenken hoe ik dat het beste kan vormgeven. Mocht ik nog ergens tegenaan lopen dan zal ik wel weer even langskomen. Bedankt in ieder geval voor zover voor de feedback, altijd erg prettig!
 
Thomas van den Heuvel

Thomas van den Heuvel

26/11/2019 14:40:09
Quote Anchor link
Een platte lijst lijkt mij nog steeds het beste. Eentje met hele simpele beslislogica die je voor het serveren van een webpagina raadpleegt: is dit een pagina die een nieuwe locatie heeft (middels een exacte match)? zoja: redirect, zonee: hervat normale flow.

Houd het simpel.

Over die ? in de URI, het hangt er een beetje vanaf of dat verwijst naar pagina's met "echte" content of naar een soort resultaatpagina van zoekfunctionaliteit. In het laatste geval hoef je hier waarschijnlijk niet allerlei vertalingen van oud naar nieuw voor bij te houden maar als het bijvoorbeeld naar webteksten wijst die in de vorige versie nog geen "nette" naamgeving hadden (bijvoorbeeld documentation.php?id=12 ofzo) dan loont het natuurlijk mogelijk wel de moeite om een naamgeving te verzinnen en een vertaling op te nemen in de lijst van redirects.

Je zou natuurlijk ook eens kunnen kijken - als je deze informatie hebt - welke pagina's in het verleden het drukst bezocht werden. Je zou je dan van een soort van 80/20-regel kunnen bedienen en enkel voor de interessantse pagina's vertalingen kunnen opstellen.
Gewijzigd op 26/11/2019 14:45:07 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.