Problemen met schone URL’s oplossen in Drupal 8
Basisprincipes
In Drupal 8 zijn schone URL’s standaard ingeschakeld en kunnen ze niet worden uitgeschakeld. De rewrite-module moet echter op je webserver zijn geïnstalleerd.
Controleer de adresbalk van je browser. De URL’s van je site mogen geen ?q= in het adres bevatten.
Voorbeeld van correcte «schone URL’s»
http://www.example.com/node/83
Voorbeeld van niet-werkende «schone URL’s»
http://www.example.com/?q=node/83
Er zijn aanvullende instructies beschikbaar voor het configureren van schone URL’s op verschillende systemen, zoals Apache, WAMP, XAMPP en IIS.
Serverconfiguratie voor schone URL’s
Je kunt meer lezen over andere webserververeisten.
Serverconfiguratie voor schone URL’s op een dedicated server met httpd.conf
Het inschakelen van schone URL’s op een dedicated server omvat de volgende stappen:
1. Schakel mod_rewrite in voor Apache. Je kunt je webhost vragen of de Apache-documentatie raadplegen over mod_rewrite voor meer informatie. Ten minste moet je ervoor zorgen dat mod_rewrite is ingeschakeld in je Apache-installatie.
Om te controleren of mod_rewrite beschikbaar is in Apache2, kun je in de opdrachtregel het volgende typen om een lijst van alle geïnstalleerde Apache-modules te tonen:
apache2ctl -M
Op sommige systemen kan dit zijn:
apachectl -M
of
httpd -M
2. Controleer in de uitvoer of rewrite_module in de lijst met modules is opgenomen.
Als de rewrite-module niet in de lijst voorkomt, moet deze worden gecompileerd of beschikbaar worden gemaakt als een laadbare module. Over het algemeen kun je Apache instrueren om de module te laden door het volgende toe te voegen:
LoadModule rewrite_module modules/mod_rewrite.so AddModule mod_rewrite.c
in je Apache-configuratiebestand (zie hieronder). Zorg ervoor dat je AddModule mod_rewrite.c
uitcommentarieert als deze is uitgeschakeld. Het volgende commando kan werken om de module in te schakelen zonder bestanden te bewerken:
a2enmod rewrite
Let op dat deze aanpak niet op alle combinaties van besturingssystemen en Apache-servers werkt – raadpleeg de Apache-documentatie voor de juiste syntaxis.
Vergeet niet Apache opnieuw te starten zodat de nieuwe configuratie van kracht wordt.
3. Zoek vervolgens het juiste Apache-configuratiebestand voor je site. Afhankelijk van de serverconfiguratie kan dit httpd.conf, een virtueel-hostbestand (vhost.conf), een specifiek sitebestand (zoals «default») of apache2.conf zijn. Deze bevinden zich meestal in /etc/httpd/conf, /etc/apache2 of een submap; als dat niet het geval is, probeer dan het volgende commando:
find /etc -name httpd* of find /etc -name apache2*
Als je geen schrijfrechten hebt voor deze bestanden en schone URL’s niet standaard werken, moet je mogelijk contact opnemen met je systeembeheerder of hostingprovider voor hulp. Je kunt echter nog steeds deze configuratiebestanden lezen om problemen te diagnosticeren.
4. De volgende stap is het kopiëren of toevoegen van de Drupal-instellingen aan het configuratiebestand. Hier vind je instructies over het toevoegen van Drupal-richtlijnen aan de configuratie. Raadpleeg het .htaccess-bestand van Drupal voor voorbeelden zoals dit voor Drupal 8:
RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !=/favicon.ico RewriteRule ^ index.php [L]
Of dit voorbeeld voor Debian 8 + Apache2 + ISPConfig met een wildcard voor alle sites:
<Directory /var/www/clients/*/*/web/> RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] </Directory>
Controleer of je het .htaccess-bestand van de juiste Drupal-hoofdversie bekijkt (bijv. 8.x).
Opmerking: als je de herschrijfregels niet in het Apache-configuratiebestand wilt plaatsen, kun je ook gewoon het Drupal .htaccess-bestand gebruiken (zoals bij shared hosting). Je moet dan de AllowOverride-richtlijn in je Apache-configuratiebestand inschakelen, zodat lokale .htaccess-overrides zijn toegestaan:
AllowOverride All AccessFileName .htaccess
Lees Behind the scenes met Apache .htaccess voor een diepgaand overzicht van .htaccess. Bekijk ook de AllowOverride-richtlijnen voor Apache 2.
Opmerking over MultiViews: Apache ondersteunt een functie genaamd «MultiViews» (in bredere zin: «content negotiation»), waarmee bestanden zonder extensie kunnen worden benaderd. Bijvoorbeeld, als je een bestand hebt met de naam «evaluation.txt», kan een site met MultiViews dit openen via «example.com/evaluation». Hoewel MultiViews nuttig kan zijn, veroorzaakt het vaak problemen bij gebruik van schone URL’s in Drupal. Tenzij je weet wat je doet, gebruik MultiViews niet met schone URL’s. MultiViews is standaard uitgeschakeld in Apache, dus dit is meestal niet van toepassing. Zie de Apache-documentatie voor meer informatie over MultiViews.
Serverconfiguratie voor schone URL’s op shared hosting met .htaccess
De standaard Drupal-installatie bevat een voorbeeld .htaccess-bestand dat meestal voldoende is om schone URL’s te laten werken. Het kopiëren van dit bestand wordt soms overgeslagen vanwege de punt in de bestandsnaam. Controleer daarom of dit bestand aanwezig is in je Drupal-installatie voordat je schone URL’s inschakelt.
Gebruik ls -a
in de terminal om te bevestigen dat verborgen bestanden worden weergegeven.
Als het bestand aanwezig is, maar schone URL’s nog steeds niet werken, probeer dan enkele van de onderstaande probleemoplossingstips. Neem contact op met je hostingprovider als het probleem aanhoudt.
Probleemoplossing
Controleer of .htaccess wordt gebruikt
Apache moet expliciet worden geïnstrueerd om de instructies in je .htaccess-bestand te respecteren. Dit is standaard uitgeschakeld, hoewel de meeste hosts het inschakelen. De AllowOverride All-richtlijn hierboven zorgt ervoor dat .htaccess wordt toegepast.
Om te testen of je host .htaccess leest, kun je tijdelijk een foutieve regel toevoegen om te zien of de site breekt. Je site zou dan onmiddellijk een «500 Server Error» moeten tonen. (Verwijder de foutregel direct daarna.)
Als er niets gebeurt, wordt .htaccess genegeerd en kun je geen schone URL’s gebruiken tot dit wordt ingeschakeld via je host of httpd.conf.
RewriteBase instellen
De belangrijkste configuratieoptie die je mogelijk moet aanpassen, is RewriteBase. Dit kan worden ingesteld in het Drupal .htaccess-bestand of in httpd.conf, afhankelijk van waar je de herschrijfregels hebt geplaatst. Standaard is RewriteBase uitgeschakeld in het Drupal .htaccess-bestand, wat voor de meeste configuraties werkt.
Als schone URL’s niet werken, moet je deze regel mogelijk aanpassen. Bijvoorbeeld, als je Apache DocumentRoot /var/www/ is (d.w.z. /var/www/index.html is de startpagina), en je Drupal-installatie zich bevindt in /var/www/mysite/, stel dan RewriteBase in op:
RewriteBase /mysite
In sommige gevallen werkt het instellen van:
RewriteBase /
ook goed voor schone URL’s.
$base_url
Mogelijk moet je de variabele $base_url in het settings.php-bestand handmatig instellen als deze nog niet is ingesteld. Servers die FastCGI gebruiken kunnen problemen ondervinden als deze variabele is uitgeschakeld (zie http://bugs.php.net/bug.php?id=19656).
Multi-site
RewriteBase werkt wanneer je Drupal-installatie één site bedient, of meerdere sites die zich in dezelfde submap bevinden. Bijvoorbeeld:
RewriteBase /
zal werken voor deze sites:
http://www.example.com/
http://www.example2.com/
http://www.example3.com/
RewriteBase /mysite
zal werken voor deze sites:
http://www.example.com/mysite
http://www.example2.com/mysite
http://www.example3.com/mysite
Als je sites echter in verschillende submappen staan, werkt RewriteBase niet. Je moet een specifieke regel maken voor elke submap. Bijvoorbeeld:
http://www.example.com/
http://www.example.com/mysite
Om schone URL’s voor beide te activeren, voeg je het volgende toe vóór de bestaande rewrite-regels:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} ^/mysite/ RewriteRule ^ /mysite/index.php [L]
Locatie van index.php
Voor sommige serverconfiguraties moet je mogelijk het Drupal .htaccess-bestand aanpassen. Zoek de volgende regel aan het einde van .htaccess:
RewriteRule ^ index.php [L]
Je moet mogelijk index.php vervangen door het pad naar je index.php-bestand binnen Drupal. Bijvoorbeeld, als de homepage van je site http://example.com/subdir/ is, gebruik dan /subdir/index.php in plaats van index.php. Als je site http://example.com/ is, gebruik dan /index.php. Dit is nodig op sommige, maar niet op alle servers.
Schone URL’s maken met de Path-module
Met schone URL’s zal Drupal URL’s genereren in de vorm van «http://www.example.com/node/83». Om het deel «node/##» te wijzigen in iets als «news/june-1st-news», moet je de Path-module inschakelen. Zie de handleiding van de Path-module voor meer informatie.