Variabelen in RewriteRule blijven leeg

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Ik heb een bepaalde RewriteRule en heb van de match bepaalde stukken nodig. Deze blijken echter allemaal leeg te zijn. Ik heb deze RewriteRule:
RewriteRule ^assets/img(.*)/[a-zA-Z0-9-_\.]*\.[^/]+\.[a-z]{2,4}$ script.php?1=$1&2=$2&3=$3&4=$4 [L]

Uiteindelijk worden de $1 t/m $4 op een andere manier gebruikt, maar dit is om te testen. Deze regel matcht wel, ik krijg namelijk de output van het scriptje te zien. Als de regel niet zou matchen treden de regels die eronder staan namelijk in werking.

Als ik echter bekijk wat er in $_GET['1'] t/m $_GET['4'] zit, zijn dit allemaal lege strings. Ik heb een vaag idee wat de reden van dit probleem zou kunnen zijn, maar ben daarvan niet zeker. Eerst werkte het wel, maar nu niet meer :p

Wat er is gebeurd: in plaats van elke site apart te configureren heb ik een server alias gemaakt met een virtuele document root. Oftewel (voor in je htdocs.conf):
ServerAlias *.localhost
VirtualDocumentRoot "/var/www/%1/public"

Om dat verder te laten werken was ook een RewriteBase nodig. Dus nu staat bovenin mijn .htaccess:
RewriteEngine On
RewriteBase /

Enig idee of dit inderdaad relevant is? En zo ja, hoe dit opgelost kan worden?

Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
In de rewriterule geef je met haakjes de "variablen" aan

in jou geval dus alleen het stukje na img:
code:
1
2
3
RewriteRule ^assets/img(.*)/[a-zA-Z0-9-_\.]*\.[^/]+\.[a-z]{2,4}$ script.php?1=$1&2=$2&3=$3&4=$4 [L]
                       ^^^^
                        Hier dus


Je zal meer haakjes toe moeten voegen, iets als:
code:
1
RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ script.php?1=$1&2=$2&3=$3&4=$4 [L]


Misschien is het echter in jou geval beter om alles wat niet bestaat naar een php bestand te laten redirecten. Dat php bestand parsed dan vervolgens zelf de url.

[ Voor 5% gewijzigd door ReenL op 25-10-2010 23:33 ]


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
ReenL schreef op maandag 25 oktober 2010 @ 23:32:
In de rewriterule geef je met haakjes de "variablen" aan
Mm, ik had niet verwacht dat de haakjes zouden uitmaken. Kennelijk wel, ik krijg nu inderdaad de juiste variabelen te zien! Bedankt :)
Misschien is het echter in jou geval beter om alles wat niet bestaat naar een php bestand te laten redirecten. Dat php bestand parsed dan vervolgens zelf de url.
Het zit een beetje anders, er zitten meer regels achter ;)

De bedoeling is als volgt:
1) Een bestand bestaat, je verwijst direct door:
/assets/img/folder/original.png > /assets/img/folder/original.png

2) Je vraagt een bewerkte versie op die bestaat:
/assets/img/folder/original.small.png > /assets/img/.original.png/small.png

3) Je vraagt een bewerkte versie op die niet bestaat:
/assets/img/folder/original.special.png > /assets/img/image.php?....

Hiervoor heb ik deze regels aangemaakt (mede ook op advies door stackoverflow)
code:
1
2
3
4
5
6
7
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^.*$ - [NC,L]

RewriteCond %{DOCUMENT_ROOT}/assets/img$1/.$2.$4/$3.$4 -f
RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ assets/img$1/.$2.$4/$3.$4 [NC]
RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ assets/img/image.php?path=$1&file=$2.$4&template=$3 [NC,L,QSA]

Nu werkt stap 1 (direct doorverwijzen), maar daarna gaat het mis. Alles gaat richting het php-scriptje, terwijl ik juist een rewrite wil maken naar een bestaand bestand op mijn filesystem. Dat bestand bestaat, daar heb ik naar gekeken. Maar toch gaat daar nog iets mis...

Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Hiermee kun je aangeven alleen als het bestand of de map niet bestaat:
code:
1
2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Waarschijnlijk moet je dus de regels dan dus omdraaien.

Zoiets wordt het dan:
code:
1
2
3
4
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ assets/img/image.php?path=$1&file=$2.$4&template=$3 [NC,L,QSA]
RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ assets/img$1/.$2.$4/$3.$4 [NC]


Wat je ook kan doen is gewoon alles naar image.php redirecten:
code:
1
RewriteCond ^assets/img(.*)$ assets/img/image.php


PHP:
1
2
3
4
5
6
7
8
9
<?php
$requestUrl = $_SERVER['REQUEST_URI'];
//parse the $requestUrl dus met strpos of explode en haal daar path/file en template uit.
if ( file_exists($filePath) ) {
    header('Content-Type: image/png');
    readfile($filePath);
    exit;
}
// Hier de code die je nu al uitvoert


Code is niet getest. Maar op deze manier heb je niet van die complexe routes en laat je php zoveel mogelijk zelf afhandelen.

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
ReenL schreef op dinsdag 26 oktober 2010 @ 10:32:
Hiermee kun je aangeven alleen als het bestand of de map niet bestaat:
code:
1
2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Waarschijnlijk moet je dus de regels dan dus omdraaien.

Zoiets wordt het dan:
code:
1
2
3
4
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ assets/img/image.php?path=$1&file=$2.$4&template=$3 [NC,L,QSA]
RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ assets/img$1/.$2.$4/$3.$4 [NC]
Uiteraard moet je eerst bekijken of het bestand wél bestaat, want requests naar bestaande files of links wil je niet kwijtraken (denk ook aan css en scripts). Vandaar ook de eerste drie regels in mijn .htaccess.

Daarná wil je pas checken of een bestand wat volgens de rewritecond wel/niet bestaat. Of je dat dan omdraait maakt niet veel meer uit (afaik). Maar ik ben er al wat verder achter dat de eerste RewriteRule sowieso niet goed werkt
Wat je ook kan doen is gewoon alles naar image.php redirecten:
code:
1
RewriteCond ^assets/img(.*)$ assets/img/image.php
Dat is juist iets wat we willen voorkomen. Op grote applicaties met veel requests is php echt een bottleneck als het om afbeeldingen gaat. Je wil niet alle afbeeldingen door de compiler halen, dus juist geresizede of gecropte afbeeldingen worden opgeslagen na een eenmalige processtap. De vervolgrequest kunnen dan direct het bestand (zegmaar cache) aanspreken in plaats van door de hele molen te moeten. Een gigantische performancewinst kan ik je vertellen ;)