Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[php/mysql] SEO url dilemma

Pagina: 1
Acties:

  • Saven
  • Registratie: December 2006
  • Laatst online: 20:24

Saven

Administrator

Topicstarter
Heyy devvers,
Ik zit met een dilemma wat betreft mooie url's voor mn php systeempje.

Laat ik beginnen met zeggen dat het een MVC opzet heeft, en de url's er standaard zo uit zien:
http://xxxxx.tld/contoller/method/param1/param2/etc


Over het algemeen al een redelijke url, maar specifiek voor SEO doeleinden is dit niet altijd toereikend.
Stel dat ik namelijk een controller 'product' heb, en daarin nog een method heb genaamd 'overzicht' krijg ik dus zo'n url:
http://xxxxx.tld/product/overzicht/product-naam.html


Met een en ander 'hack'werk heb ik voor de producten ook kunnen zorgen dat de url er als volgt uit komt te zien:
http://xxxxx.tld/product-naam.html

Feitelijk kijk ik vóórdat ik een controller laad, of de eerste parameter na de '/' voorkomt in mijn database. zo ja > laad de product controller, zo nee > laad de controller die hetzelfde is als de eerste parameter (dus back to basics, gewoon weer url's afhandelen zoals de bedoeling is).

Alleen moet dit ook nog gebeuren voor de hoofdcategorie, en subcategorie.
De url voor de hoofdcategorie zou dan zoiets moeten worden:
http://xxxxx.tld/keuken-apparatuur.html


En de url voor de subcategorie het volgende:
http://xxxxx.tld/keuken-apparatuur/staafmixers.html


Nu jullie een beetje snappen (hopelijk) wat mijn bedoeling is, zit ik enorm in twijfel of ik dit in mijn applicatie ga afhandelen, of doormiddel van url rewrites in een htaccess bestand.
Dat laatste doet eigenlijk precies waarvoor het gemaakt is, alleen is het probleem dat als er een nieuw product wordt toegevoegd, of een nieuwe (hoofd)categorie, dat die htaccess weer veranderd moet worden.

Waar ik meer aan zat te denken is voor een aanpak die ik eigenlijk al gebruik voor de producten. Ik kijk of er een product in de database staat, waarvan de seo_url waarde overeenkomt met de eerste parameter na de '/' in de url. Dit zou ik dan omgooien naar een aparte tabel in mijn database die ik 'routing' oid noem.

Voorbeeldje
code:
1
2
3
4
5
6
7
8
9
ROUTING

|---------seo_url--------------------------|---controllers---|
| keuken/staafmixers/philips-xzc-230.html  | product         |
|------------------------------------------|-----------------|
| keuken/staafmixers.html                  | category        |
|------------------------------------------|-----------------|
| keuken.html                              | category        |
|------------------------------------------|-----------------|

Eventueel in een cache bestand stoppen zodat ik niet elke keer die query uit hoef te voeren.
Dit zou ook te automatiseren zijn, als ik een nieuw product toevoeg, dat hij automatisch de SEO url aanmaakt.

Weet ook niet precies hoe grote systemen als bijv. Joomla of Magento oid dit doen, of dat ze dit helemaal niet doen?

Anyways, hebben jullie een idee over de beste manier? :)

Edit: besloten om de product.html niet direct na de eerste '/' te doen, maar om hoofd-cat/sub-cat/product.html te doen
Edit2: als de naam van de method leeg is, roept hij de index() method aan

[ Voor 4% gewijzigd door Saven op 09-03-2013 14:28 ]


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Het probleem hiermee is dat je allerlei dubbele content krijgt en dat je kans hebt op dubbelen (wat moet er gebeuren als je een categorie staafmixers hebt en een product staafmixers)

Maar bovenal vraag ik me af wat je hiermee denkt te bereiken? Je standaard uri's lijken mij veel beter voor seo, die geven namelijk ook gelijk categorie-info etc mee.

Wat moet er bijvoorbeeld gebeuren als je een type staafmixer hebt die op accu werkt en hetzelfde type (maar wel andere uitvoering) werkt ook op het lichtnet, dan heb je 2 producten met dezelfde omschrijving, ook al verzin je hier een regel voor. Google kan niet het onderscheid zien zonder de category (accu / lichtnet)

  • Saven
  • Registratie: December 2006
  • Laatst online: 20:24

Saven

Administrator

Topicstarter
Bedankt voor je reactie. Het eerste probleem is niet meer van toepassing, ik heb besloten om het te houden zoals in de laatste tabel:
code:
1
2
3
4
5
6
7
|---------seo_url--------------------------|---controllers---|
| keuken/staafmixers/philips-xzc-230.html  | product         |
|------------------------------------------|-----------------|
| keuken/staafmixers.html                  | category        |
|------------------------------------------|-----------------|
| keuken.html                              | category        |
|------------------------------------------|-----------------|


Mijn standaard url's zouden anders zoiets worden:
(controller/method/parameter)
http://xxxxx.tld/producten/omschrijving/product-naam.html

http://xxxxx.tld/categorie/hoofd/keuken.html

http://xxxxx.tld/categorie/sub/staafmixers.html


Dat is niet zo netjes als dat ik het zo zou doen als in die tabel :)

  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
Als je MVC gebruikt, dan gebruik je vast een framework. Bijna iedere framework biedt hier mogelijkheden voor in de router.

Specialist in:
Soldeerstations
Oscilloscoop


  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 21:50
Is dit .html erachter ook voor SEO voordelig, of heb je dat voor andere redenen?

Persoonlijk lijkt het mij logischer om te hebben keuken, keuken/staafmixers en keuken/staafmixers/philips-xzc-230, aangezien je dan meer een mappen structuur hebt en 1 niveau terug kan door de URL aan te passen.

  • Saven
  • Registratie: December 2006
  • Laatst online: 20:24

Saven

Administrator

Topicstarter
-DarkShadow- schreef op zaterdag 09 maart 2013 @ 17:25:
Als je MVC gebruikt, dan gebruik je vast een framework. Bijna iedere framework biedt hier mogelijkheden voor in de router.
mijn eigen (kleine) framework
probleem is als ik daar een router systeempje in maak (die verder gaat dan de controller/method aanroepen via de url), je die elke keer weer moet updaten bij een nieuw product. de database zou dit kunnen automatiseren icm php
Barryvdh schreef op zaterdag 09 maart 2013 @ 18:31:
Is dit .html erachter ook voor SEO voordelig, of heb je dat voor andere redenen?

Persoonlijk lijkt het mij logischer om te hebben keuken, keuken/staafmixers en keuken/staafmixers/philips-xzc-230, aangezien je dan meer een mappen structuur hebt en 1 niveau terug kan door de URL aan te passen.
bij de het product wel, bij de categorieën twijfel ik nog een beetje over. dat zou inderdaad gewoon categorie/ of categorie/sub/ kunnen zijn

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Barryvdh schreef op zaterdag 09 maart 2013 @ 18:31:
Is dit .html erachter ook voor SEO voordelig, of heb je dat voor andere redenen?
Persoonlijk (ik heb er geen onderbouwing voor) verwacht ik eerder dat .html SEO-negatief is. 10 jaar geleden was het een handig iets, maar tegenwoordig heeft het of geen invloed of google etc kan besluiten om je site minder vaak te spideren omdat je zegt enkel maar statische content te serveren en dat nog eens "traag" ook (hoe snel je mini-frameworkje ook is, hij is trager dan niets).

  • Saven
  • Registratie: December 2006
  • Laatst online: 20:24

Saven

Administrator

Topicstarter
Gomez12 schreef op zaterdag 09 maart 2013 @ 23:24:
[...]

Persoonlijk (ik heb er geen onderbouwing voor) verwacht ik eerder dat .html SEO-negatief is. 10 jaar geleden was het een handig iets, maar tegenwoordig heeft het of geen invloed of google etc kan besluiten om je site minder vaak te spideren omdat je zegt enkel maar statische content te serveren en dat nog eens "traag" ook (hoe snel je mini-frameworkje ook is, hij is trager dan niets).
tja dat miniem trager is niet echt een noemenswaardig naar mijn idee :P tuurlijk lever je met een framework iets in op de performance, maar dat weegt niet op tegen de voordelen die het (kan) bied(den)

  • Cor453
  • Registratie: Mei 2011
  • Laatst online: 30-10 14:42
Saven schreef op maandag 11 maart 2013 @ 22:23:
[...]

tja dat miniem trager is niet echt een noemenswaardig naar mijn idee :P tuurlijk lever je met een framework iets in op de performance, maar dat weegt niet op tegen de voordelen die het (kan) bied(den)
True, maar wat Gomez12 bedoelt, is dat Google je site minder vaak gaat herindexeren omdat jij doet voorkomen dat je statische content serveert. Google heeft dan ideeën over hoe snel jouw pagina zou moeten laden in het geval van HTML. Jouw framework gaat er sowieso iets mee doen (met die request, bijvoorbeeld je controller een andere view laten inladen, etc.) en dan ga je dus achteruit op snelheid vanwege het parsen/interpreteren/verwerken.

  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
.html maakt niets uit voor Google SEO.

http://www.seosean.com/bl...advice-on-urls-page-names

Specialist in:
Soldeerstations
Oscilloscoop


  • Rye
  • Registratie: Mei 2005
  • Laatst online: 25-04 15:57

Rye

Wat is er mis met een htcacces en wat regular expressions?

www.ping-win.nl


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Rye schreef op dinsdag 12 maart 2013 @ 09:19:
Wat is er mis met een htcacces en wat regular expressions?
Dat 't een kolerewerk is om te onderhouden :? Dat 't totaal niet flexibel is als je (eind)gebruikers in het adminpanel o.i.d. een nieuwe url wil laten aanmaken etc.?

Gewoon 1 rewriterule: de hele zwik naar een index.php o.i.d. rewriten en daar de rest van de routering afhandelen. Kun je 't zo gek maken als je wil.

[ Voor 14% gewijzigd door RobIII op 12-03-2013 09:27 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 21:50
Rye schreef op dinsdag 12 maart 2013 @ 09:19:
Wat is er mis met een htcacces en wat regular expressions?
Dat je dan voor elke wijziging je .htaccess bestand moet gaan aanpassen.

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50

BikkelZ

CMD+Z

Wat je kunt doen is je Controller of welke module er ook voor zorgt dat de data voor je View gebouwd wordt ook een URL meebouwt, welke de meest optimale URL bevat voor die link. Deze zet je vervolgens in een canonical-metatag en dan negeert Google gewoon de URLs die niet jouw optimale opbouw hebben.

Een andere oplossing is een op 30x redirect gebaseerde die redirect naar de meest optimale URL voor je content als die niet gelijk is aan je huidige URL, dan ziet je klant ook geen suboptimale URLs meer.

iOS developer


  • Saven
  • Registratie: December 2006
  • Laatst online: 20:24

Saven

Administrator

Topicstarter
RobIII schreef op dinsdag 12 maart 2013 @ 09:26:
[...]

Dat 't een kolerewerk is om te onderhouden :? Dat 't totaal niet flexibel is als je (eind)gebruikers in het adminpanel o.i.d. een nieuwe url wil laten aanmaken etc.?

Gewoon 1 rewriterule: de hele zwik naar een index.php o.i.d. rewriten en daar de rest van de routering afhandelen. Kun je 't zo gek maken als je wil.
de routing wordt nu afgehandeld door mijn database tabel 'router'
ziet er zo uit:
code:
1
2
3
4
5
6
7
8
9
+----+----------------------------------+--------------+
| id | seo_url                          | controller   |
+----+----------------------------------+--------------+
|  1 | keuken/mixers/philips-xs324.html | product      |
|  2 | keuken/pannen/tefal-sd34.html    | product      |
|  3 | keuken/pannen                    | category     |
|  4 | keuken/mixers                    | category     |
|  5 | keuken                           | category     |
+----+----------------------------------+--------------+

daarnaast heb ik in mijn 'products' en 'cats' tabellen een veld 'router_id' om zo via de url de juiste product/categorie op te vragen.

komt dus eigenlijk neer op een soort htaccess, maar dan dynamisch. is we een stukje denormalisatie (als ik het goed heb?) maar volgens mij ontkom ik hier niet aan.

Waar ik ook aan heb zitten denken is een klein algoritme:
  • probeer eerst controller te laden via de url (standaard framework manier)
  • bestaat die controller niet, dan proberen we een hoofdcategorie te laden (aangezien dat het eerste is wat na de / in de url komt'
  • als de hoofdcategorie bestaat, showen we die
  • als er nog een subcategorie is opgegeven, probeer die te laden. (url.xx/hoofd-cat/sub-cat)
  • als er ook nog een 3e parameter is opgegeven, moet dat wel de producttitel zijn, laad het product (url.xxx/hoofd-cat/sub-cat/product.html
Nadeel is wel dat er een aantal queries uitgevoerd moeten worden voordat ik uiteindelijk een product kan laden, wat niet ten goede komt aan de laadtijd.
BikkelZ schreef op dinsdag 12 maart 2013 @ 13:28:
Wat je kunt doen is je Controller of welke module er ook voor zorgt dat de data voor je View gebouwd wordt ook een URL meebouwt, welke de meest optimale URL bevat voor die link. Deze zet je vervolgens in een canonical-metatag en dan negeert Google gewoon de URLs die niet jouw optimale opbouw hebben.

Een andere oplossing is een op 30x redirect gebaseerde die redirect naar de meest optimale URL voor je content als die niet gelijk is aan je huidige URL, dan ziet je klant ook geen suboptimale URLs meer.
Ja dat kan, maar dan moet er sowieso wel geroute worden naar dat product. Aangezien hij via de url normaliter de bijbehorende controller laad, moet ik nu de boel 'hacken' dat hij eerst opzoek gaat naar een product of categorie uit de database, die overeenkomt met de url die ingegeven is. anders wordt het ipv 'url.xx/hoofd/sub/product.html' namelijk 'url.xxx/producten(controller)/overzicht(method)/productnaam.html(parameter1)' of voor een categorie bijvoorbeeld 'url.xxx/categorie(controller)/overzicht(method)/categorie-naam(parameter1)'

Het werkt nu zo: (index is de method die standaard wordt aangeroepen als de 2e (method) parameter leeg is)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class product
{
    public $core;
    
    public function index()
    {
        //-------------------------------------
        // Get products model
        //-------------------------------------
        $this->core->load->model('products_model');
        
        //-------------------------------------
        // Get product info by seo_url (without ext)
        //-------------------------------------
        $product = $this->core->products_model->get( base_url() );
        
        if( $product !== false )
        {
            //-------------------------------------
            // Get cats (sub & root)
            //-------------------------------------
            $cats = $this->core->products_model->get_cats($product['cat_id']);
            
            //-------------------------------------
            // Put 'em in array for template
            //-------------------------------------
            $breadcrumbs = array($cats['root_name'], $cats['name'], $product['title']);
            
            //-------------------------------------
            // Assign the template vars
            //-------------------------------------
            $this->core->tpl->assign( array
            (
                'product' => $product,
                'breadcrumbs' => $breadcrumbs
                
            ));

        }
        else
        {
            //-------------------------------------
            // Return false for a 404 error
            // If product doesn't exists
            //-------------------------------------
            return false;
        }

        //-------------------------------------
        // Bijbehorende view wordt automatisch geladen, hoef ik niet elke keer weer te doen
        //-------------------------------------
    }
    
    public function test()
    {
        
    }
}

[ Voor 24% gewijzigd door Saven op 12-03-2013 13:57 ]


  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 21-11 15:31

TheNephilim

Wtfuzzle

Dus je hebt voor elk product in je database, een record in je tabel welke router hij moet gebruiken? Het lijkt me logische dat je voor alle producten één en dezelfde controller gebruikt.

1. /producten -> ontroller Producten: Producten overzicht.
2. /producten/123/philips-scheerapparaat -> controller Producten: Product pagina.
3. /producten/categorie/123/scheerapparaten -> controller Producten: Categorie overzicht.

Het gaat namelijk steeds over producten, daarna kun je in de producten controller delegeren naar een andere contoller/actie/etc. Maar je eerste ingang is steeds de controller producten voor de voorgenoemde urls.

Dan kun je als extra nog;

4. /producten/123/philips-scheerapparaat/specificaties -> controller Producten: Product specificaties

Alles wat begint met /producten gaat naar controller producten, daarna ga je met de rest van de link aan de slag. /producten/(\d+)/[^/]+ bevat het product ID en de SEO naam van het product. Erachter kan dan eventueel /specificaties of een andere action, want wat ga je dan met het product doen.

---

Nu heb ik zelf niet zoveel ervaring met MVC, heb er in ieder geval niks mee gemaakt. Misschien ben je met bovenstaande geholpen! :D

  • Saven
  • Registratie: December 2006
  • Laatst online: 20:24

Saven

Administrator

Topicstarter
Thanks voor je comment :) Dat was inderdaad ook een optie geweest, alleen zorg ik d.m.v. mijn router tabel, dat ik de hoofdcategorie en subcategorie in de URL kan verwerken. En juist de controller naam niet, omdat dat een overbodig keyword is voor SEO

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 21-11 15:31

TheNephilim

Wtfuzzle

Saven schreef op woensdag 13 maart 2013 @ 12:15:
Thanks voor je comment :) Dat was inderdaad ook een optie geweest, alleen zorg ik d.m.v. mijn router tabel, dat ik de hoofdcategorie en subcategorie in de URL kan verwerken. En juist de controller naam niet, omdat dat een overbodig keyword is voor SEO
Let er wel op, dat je geen framework bouwt voor je SEO. Kortom, laat dat niet de hoofdzaak zijn, maar een bijzaak. Ga dus niet denken vanuit SEO, maar vanuit de beste oplossing.

  • Saven
  • Registratie: December 2006
  • Laatst online: 20:24

Saven

Administrator

Topicstarter
Dus dan toch mijn router tabel in de database denk ik?

  • Saven
  • Registratie: December 2006
  • Laatst online: 20:24

Saven

Administrator

Topicstarter
subtiele bump :P (of mag dat niet?)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wat wil je nou precies horen :? Je zult zelf de afweging moeten maken: alles in een "routertabel" mikken (en dus onderhoudgevoelig) of alles in code oplossen. Of een hybride oplossing en alles daar tussenin en voorbij. Je kunt alle kanten op. Welke je kiest is toch écht iets dat je zelf zult moeten afwegen.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Saven
  • Registratie: December 2006
  • Laatst online: 20:24

Saven

Administrator

Topicstarter
RobIII schreef op maandag 18 maart 2013 @ 15:59:
Wat wil je nou precies horen :? Je zult zelf de afweging moeten maken: alles in een "routertabel" mikken (en dus onderhoudgevoelig) of alles in code oplossen. Of een hybride oplossing en alles daar tussenin en voorbij. Je kunt alle kanten op. Welke je kiest is toch écht iets dat je zelf zult moeten afwegen.
Hmm wat zou een goede (hybride) oplossing zijn volgens jou?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Again: ik ga ga heulegaar niet zitten uitdenken wat voor jou een goede oplossing zou zijn, daar ben ik veul te lui voor :+ Zoals ik al zei: wat een goede/beste oplossing is weet je 't beste zélf en niet ik of iemand anders ;) Jij kent de ins-and-outs van je project, jij hebt een bepaalde wens, jij hebt een bepaald kennisniveau etc.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50

BikkelZ

CMD+Z

Als je Microsoft MVC gebruikt wordt routing op een standaard manier opgelost, dus http://www.domainnaam.ext...t=parameter&another=value en eventueel je POST-parameters natuurlijk.

Wil je iets anders, dan kun je dat opgeven met een nieuwe routing. Deze routing overruled je default routing als hij matcht en je kunt ook de URL voor je Controller Action terug opvragen via deze route. Dus zelfs als je content ook nog via de standaard routing terug te vinden is, dan gaat je Controller dus wel een canonical metatag toevoegen voor de geprefereerde route. Ook zul je alle links naar die Controller vanuit je andere Controllers opbouwen via die route, dus die gebruiken ook allemaal jouw preferred route.

Wat een stap verder is, is dat je zegt dat als er voor die Controller een custom route bestaat de default route in het geheel niet meer functioneert. Dat moet je zelf weten.

Maar dat heeft helemaal niks met hacken te maken, dat is een oplossing die wijd en zijd gebruikt wordt in industriestandaard MVC-oplossingen.

---------

Terug naar het probleem en een praktische oplossing:
  • URL-afhandeling in code voor maximale flexibiliteit
  • Neem *.html aan het einde als parameter
  • Ken je Controller en Action namen zodat je kunt vergelijken
  • Kijk of er "mappen" zijn
  • Eerste map is Controller normaliter, kijk of dat dat inderdaad in je lijst met Controllers voorkomt
  • Zo ja, kijk of er een volgende map is en of dat die mapt met een Action, anders Index Action doen
  • Mapt het niet met een Controller dan moet het dus een productcategorie zijn
  • Is er geen "map" maar wel een *.html parameter is het een directe link naar een product
  • Maak een uitzondering voor je root-controller en action (index/index) als je framework dat zelf niet ondersteunt

[ Voor 27% gewijzigd door BikkelZ op 19-03-2013 14:23 ]

iOS developer


  • Saven
  • Registratie: December 2006
  • Laatst online: 20:24

Saven

Administrator

Topicstarter
thanks ga ik even naar kijken :)

  • Cor453
  • Registratie: Mei 2011
  • Laatst online: 30-10 14:42
Ik zou gewoon een MVC-pattern gebruiken, BikkelZ zei het al. Of je nou Zend gebruikt, ASP.NET MVC of weet ik veel wat, je hebt in ieder geval minder rotzooi op te ruimen. URL Rewriting enzo worden al voor je gedaan (in ASP.NET MVC in ieder geval), en eigenlijk ben je dus veel minder bezig met routing.

@BikkelZ: Als je ASP.NET MVC gebruikt hoef je toch niet per se een .html extensie te doen, MVC regelt dat soort dingen toch... Of is er een SEO-achtige reden dat je het zegt?
Pagina: 1