[NGINX] Rewrite maakt bestanden onbereikbaar

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • [NGINX] Rewrite maakt bestanden onbereikbaar

      Hallo,

      Ik heb voor me website 1 simpele rewrite in gebruikt, gemaakt met een generator online.
      Dat werkt goed, en pagina`s als site.nl/index.php?page=contact is nu gewoon site.nl/contact

      Source Code

      1. rewrite ^/([^_]*)$ /index.php?page=$1 last;
      Nu heb ik alleen dat vervolgens bestanden als robots.txt en sitemap.xml niet meer te openen zijn.
      Deze vallen nu terug op de home pagina.

      Mijn vraag is nu dus, hoe kan ik een NGINX rewrite maken die de volgende links mogelijk maakt.
      site.nl/index.php?page=contact > site.nl/contact
      site.nl/sitemap.xml > site.nl/sitemap.xml

      Ik las al dat ik een rewrite kan maken voor die bestanden en gebruik van de last optie, maar om dat nou per bestand te doen lijkt me erg omslachtig.

      Jordy
    • TL;DR controleer eerst of je een bestaand bestand/directory aanroept, en voer daarna (als het voorgaande niet het geval was) een rewrite uit.

      Ik denk dat je in je voorbeeld de externe aanroep en de interne vertaling door elkaar haalt?

      De syntax van rewrite staat waarschijnlijk wel in de goede volgorde. Ik ken deze verder niet (ben Apache gewend) maar ik kan mij zo voorstellen dat er ook in nginx een commando is voor het skippen van bestaande bestanden (en directories). Hier zou je dan eerst op kunnen controleren, daarna heb je je fallback naar index.php.

      Je zou dit trouwens nog kunnen vereenvoudigen: je zou ook ALLES wat niet refereert aan een bestaand bestand (of directory) simpelweg door kunnen sturen naar index.php. Vervolgens controleer je $_SERVER['REQUEST_URI'], ontleed je het (relatieve applicatie-)pad dat is aangeroepen en bekijk je of dit een valide aanroep was. Dit principe heb ik ook in een artikel beschreven.

      Wat ik niet begrijp is dat mensen voor dit doel pertinent een querystring-variabele (?page=, ?q=, ?whatever=) reserveren. Dit is namelijk helemaal niet nodig en vervuilt in zekere zin je querystring-scope.

      EDIT deze oplossing biedt mogelijk soelaas (2 minuten googlen). Je zult dan wel zelf de rest van je URL moeten ontleden maar het probleem verplaatsen naar PHP heeft zo zijn voordelen, je kunt daar dan het request verder afhandelen, in plaats van worstelen met hardcoded zut in een nginx configuratie-bestand.

      The post was edited 2 times, last by FangorN ().

    • Bedankt voor je reactie.
      Heb het iets anders, maar wel iets gehad aan je denkwijze om alles in de PHP af te handelen.

      Heb nu iets wat kijkt of het bestand bestaat, en anders naar de index.php verwijst.
      En met je het $_SERVER['REQUEST_URI'] kijk ik vervolgens welke pagina er eigenlijks opgevraagd word.

      Source Code

      1. location / {
      2. if (!-e $request_filename){
      3. rewrite ^(.*)$ /index.php break;
      4. }
      5. }
      Lijkt nu helemaal te werken.

      Schijnt de nginx versie te zijn van deze apache methode.

      Source Code

      1. #
      2. # Redirect all to index.php
      3. #
      4. RewriteEngine On
      5. # if a directory or a file exists, use it directly
      6. RewriteCond %{REQUEST_FILENAME} !-f
      7. RewriteCond %{REQUEST_FILENAME} !-d
      8. RewriteCond %{REQUEST_URI} (/[^.]*|\.)$ [NC]
      9. RewriteRule .* index.php [L]
      Display All


      Gebruikte bronnen:
      stackoverflow.com/questions/12…h-nginx/21731846#21731846
      winginx.com/en/htaccess