OpenCart is een gratis webshop (eCommerce platform) gemaakt in PHP. Na de eenvoudige installatie, die men zelfs kan doen zonder de handleiding te lezen, is het eerste wat je doet de backoffice eens doorkruisen. Al snel zal je de optie SEO zien en uiteraard ga je deze gaan activeren. Maar wat blijkt; alleen de producten, categorieën en enkele informatie pagina's hebben deze functionaliteit.

Dus op zoek naar een SEO extentie die dit afhandeld. Ik had er één gevonden voor een schappelijke prijs, maar die gaat nogal wat bestanden in de core gaan aanpassen. En daar hou ik niet van, temeer dit via extenties/modules gaat die resources verbruiken bij ieder paginabezoek. Ik heb het over: OCmod, event handlers, VQmod (Integrated VQmod of Qphoria's VQmod) of een 'Override Engine' die de classes kan extenden.

Dan maar zelf iets maken was de boodschap, maar dan vooral iets eenvoudigs en future proof, zodat bij een volgende upgrade (die blijkbaar nog manueel moet gedaan worden) er geen werk verloren gaat.

Het voordeel (en gelijk wat nadelen) die ik heb is dat er voor alle website een NGinX staat als Reverse Proxy. Voor deze OpenCart websites ga ik alleen de PHP bestanden laten afhandelen door Apache. De config is als volgt:

  location ~* .(js|css|ico|xml|swf|flv|eot|ttf|woff|pdf|xls|htc)$ {
    add_header Pragma "public";
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    access_log off;
    log_not_found off;
    expires 90d;
  }

  location ~* .(jpg|jpeg|gif|css|png)$ {
    access_log off;
    expires 10d;
  }

  # SEO URL Settings
  rewrite ^/sitemap.xml$ /index.php?route=extension/feed/google_sitemap last;

  location  /admin {
    #ignore upstream headers (those of apache)
    proxy_ignore_headers X-Accel-Expires;
    proxy_ignore_headers Expires;
    proxy_ignore_headers Cache-Control;

    add_header Pragma no-cache";
    add_header Cache-Control "no-cache, no-store, must-revalidate, proxy-revalidate";

    proxy_set_header X-Real-IP  $remote_addr;
    #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:4443/admin;
  }

  location /index.php {
    proxy_ignore_headers X-Accel-Expires;
    proxy_ignore_headers Expires;
    proxy_ignore_headers Cache-Control;
    add_header Pragma no-cache";
    add_header Cache-Control "no-cache, no-store, must-revalidate, proxy-revalidate";

    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:8443/reynaert.be.php;
  }


  location / {
    # This try_files directive is used to enable SEO-friendly URLs for OpenCart
    try_files $uri $uri/ @opencart;
  }

  location @opencart {
    rewrite ^/(.+)$ /index.php?_route_=$1 last;
  }
  # End SEO settings

Even terzijde: Er zijn een aantal proxy_ignore headers toegevoegd omdat (vooral Firefox) het enorm lastig heeft met het niet cachen van de paginas.

Zoals je kan zien verander ik index.php (van NGinX) naar reynaert.be.php (op Apache)
Ik weet zeker dat bij een update dit bestand niet zal overschreven worden. Hierin staat het minimale om de website terug te laten draaien.. Ja, gewoon dus een include van index.php en dan nog wat eigen code.

// run OpenCart
require_once('index.php');

/*
	Modify scripting
	activate this once after each update, or you could extend this and look for a change of the version number
*/
//Reynaert::upgrade();

echo '';

De lijn Reynaert::upgrade() staat in commentaar, want die hoeft slechts geactiveerd te worden na een upgrade.

Wat doet Reynaert::upgrade() en van waar komt dit?

Wel, al snel kan je in de code zien dat alle php bestanden 'ge-autoload' worden. En dat de Classes (the Model) staan in de folder system/library. Het is dan ook daar waar ik mijn Reynaert class heb geplaatst.

De classe bevat 3 hoofdbrokken

  • ob()
  • getRealClientIP()
  • upgrade()

De ob functie is degene die gaat zorgen dat alle 'html' nog eens doorlopen wordt en net voor het flushen van het buffer aangepast worden. De prefix https://shop.aquanav.be/ wordt vervangen door /, want dit is toch voor niks nodig. En dan worden alle index.php?route=... vervangen naar wat we hebben ingevoerd in het onderdeel 'Design > SEO URL' in de admin sectie.

Aangezien er gewerkt wordt met een reverse proxy en dat OpenCart hier helemaal niet op voorzien is moest ik iets schrijven om alle stukken waar staat: $this->request->server['REMOTE_ADDR'] te vervangen door een eigen methode \Reynaert::getRealClientIP(). En ik heb hier speciaal gekozen om de Class in een namespace manier te schrijven.

En tenslotte de upgrade functie die alle bestanden gaat doorlopen om de getRealClientIP functie te gaan gebruiken en om de ob functie te activeren op de startup pagina.

De source code voor de pseudo index.php pagina en de classe kan je hier downloaden.

Veel plezier ermee.

Tags gerelateerd aan dit artikel:

Blog Categorie