[apache+php] rewritemap probs

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023
situatie
Ik heb hier een klein testservertje staan dat via een rewritemap virtualhosts dynamisch simuleert.
Als er bijvoorbeeld www.tweakers.lan/pagina.php opvraag, wordt er in de db gekeken waar het bijbehorende bestand staat, en wordt de absolute padnaam teruggegeven.
Dit loopt via een php-cgi script (stdin en stdout).
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
#!/usr/bin/php4 -q
<?        
include('config.php');

$input = fopen("php://stdin",'r');

while($line = trim(fgets($input, 1 << 14 ))) {

   preg_match('/^\(([a-z0-9\.\-]*)(:\d+)?\)(.*)/',$line,$mt);
   $domainname = $mt[1];
   $port       = $mt[2]; 
   $filename   = $mt[3]; 


   $domain = getWebroot($domainname); 
   if(is_null($domain)) {
      $result =  http404_file;
   } else {
      $result =  "$domain$filename";
   }
   
   echo $result , "\n";
   flush();
} 
[...]


in mijn rewrite.conf (geincludeerd in httpd.conf) staat:
code:
1
2
3
RewriteEngine on
RewriteMap  domain-map prg:/etc/apache/rewrite/translatedomain.php
RewriteRule ^(.*)$ ${domain-map:(%{HTTP_HOST})$1} [L]


De functie getWebroot retourneert de webroot van de betreffende domeinnaam, indien de domeinnaam onbekend is, retourneert 'ie NULL. Ik heb door uitgebreid testen en loggen kunnen vaststellen dat die functie correct is.

probleem
Als ik snel achter elkaar pagina's opvraag (dit geldt ook voor gif-jes en zo) dan gaat apache fouten maken: hij verwart de pagina's met elkaar. In plaats van index.php krijg ik dan image.gif terug (overigens inclusief correcte mime-types).

wat is het niet?
Mijn leesbuffer is niet te klein. (1<<14 is best groot 8))
getWebRoot() is correct. Daar ben ik absoluut zeker van.

vermoedens
Ik vermoed dat apache de requests niet in dezelfde volgorde uitleest als dat 'ie ze schrijft.


Wie heeft hier ervaring mee, en weet de oplossing?

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 17-09 22:52
niet een directe oplossing, maar misschien kun je :

RewriteLog /pad/naar/log/rw.log
RewriteLogLevel 2

aan je httpd.conf toevoegen. aan de uitvoer kun je zien of apache echt pagina's door elkaar haalt. desgewenst loglevel verhogen/verlagen.

een andere gedachte : wordt nu eigenlijk voor elk request de cgi-versie van php opgestart voor het doen van die rewrite ? zo ja, is dat niet een enorme performance-hit ?

Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023
tech-no-logical schreef op 04 februari 2003 @ 12:55:
niet een directe oplossing, maar misschien kun je :

RewriteLog /pad/naar/log/rw.log
RewriteLogLevel 2

aan je httpd.conf toevoegen. aan de uitvoer kun je zien of apache echt pagina's door elkaar haalt. desgewenst loglevel verhogen/verlagen.

een andere gedachte : wordt nu eigenlijk voor elk request de cgi-versie van php opgestart voor het doen van die rewrite ? zo ja, is dat niet een enorme performance-hit ?
Loglevel loopt... Ik zal even moeten wachten daarop, daar slechts 1 a 2 procent fout gaat.

Dat php-script wordt opgestart als de server herstart wordt, en wordt afgesloten als de server stopt. In dat laatste geval betreft het een SIG_TERM, en kunnen we dus niet echt netjes opruimen...

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023
Een log MET fout is te vinden op: http://bitfactory.nakijken.nl/rewrite.log

een quote van de fout (sorry voor de layout)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
init rewrite engine with requested uri /img/navigatie/infoberoepskrachten2.gif
applying pattern '^(.*)$' to uri '/img/navigatie/infoberoepskrachten2.gif'
init rewrite engine with requested uri /img/navigatie/infoorganisaties2.gif
applying pattern '^(.*)$' to uri '/img/navigatie/infoorganisaties2.gif'
init rewrite engine with requested uri /img/navigatie/infoorganisaties.gif
applying pattern '^(.*)$' to uri '/img/navigatie/infoorganisaties.gif'
rewrite /img/navigatie/infoorganisaties2.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoberoepskrachten2.gif
local path result: /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoberoepskrachten2.gif
go-ahead with /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoberoepskrachten2.gif [OK]     
rewrite /img/navigatie/infoberoepskrachten2.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoorganisaties2.gif
local path result: /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoorganisaties2.gif                                
go-ahead with /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoorganisaties2.gif [OK]                                
init rewrite engine with requested uri /img/topfoto.jpg                                                                          
applying pattern '^(.*)$' to uri '/img/topfoto.jpg'                                                                              
rewrite /img/topfoto.jpg -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoorganisaties.gif                        
local path result: /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoorganisaties.gif                                 
go-ahead with /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoorganisaties.gif [OK]


edit:
Op de plaats van /img/topfoto.jpg werd inderdaad infoorganisaties.gif getoond.

[ Voor 7% gewijzigd door kvdveer op 04-02-2003 13:51 ]

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 17-09 22:52
heel vreemd... als ik dat log goed leest, gaat het fout in php, toch ? die retourneert de _vorige_ rewrite. om dat te controleren zou je vanuit je php-script _ook_ moeten loggen.

Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023
Mijn vermoedens kloppen.

Uit de rewritelogs (gegrept)
code:
1
2
3
4
5
6
7
8
9
10
11
12
[...snip...]
applying pattern '^(.*)$' to uri '/img/navigatie/infoalgemeen.gif'           
applying pattern '^(.*)$' to uri '/img/navigatie/infoalgemeen2.gif'
applying pattern '^(.*)$' to uri '/img/navigatie/infoorganisaties.gif' 
applying pattern '^(.*)$' to uri '/img/navigatie/infoberoepskrachten.gif' <---------
applying pattern '^(.*)$' to uri '/img/navigatie/infoorganisaties2.gif' <---------
applying pattern '^(.*)$' to uri '/img/navigatie/infoberoepskrachten2.gif'
applying pattern '^(.*)$' to uri '/img/navigatie/trainingen.gif'             
applying pattern '^(.*)$' to uri '/img/navigatie/trainingen2.gif'            
applying pattern '^(.*)$' to uri '/img/navigatie/infoopvoeders2.gif'         
applying pattern '^(.*)$' to uri '/img/navigatie/infoopvoeders.gif'          
[...snip...]


Uit de rewritelogs (ook gegrept)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[...snip..]
rewrite /img/navigatie/infoalgemeen.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoalgemeen.gif               
rewrite /img/navigatie/infoalgemeen2.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoalgemeen2.gif             
rewrite /img/navigatie/infoorganisaties.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoorganisaties.gif <---------      
rewrite /img/navigatie/infoorganisaties2.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoberoepskrachten.gif <---------   
rewrite /img/navigatie/infoberoepskrachten2.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoorganisaties2.gif  <---------
rewrite /img/navigatie/infoberoepskrachten.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoberoepskrachten2.gif
rewrite /img/navigatie/trainingen.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/trainingen.gif                   
rewrite /img/navigatie/trainingen2.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/trainingen2.gif                 
rewrite /img/navigatie/infoopvoeders2.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoopvoeders2.gif           
rewrite /img/navigatie/infoopvoeders.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/infoopvoeders.gif             
rewrite /img/navigatie/projecten.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/projecten.gif                     
rewrite /img/navigatie/projecten2.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/projecten2.gif                   
rewrite /img/navigatie/mediatheek2.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/mediatheek2.gif                 
rewrite /img/navigatie/mediatheek.gif -> /data/klanten2//S & O/internet/www.seno.nl/img/navigatie/mediatheek.gif                   
[...snip...]


En tot sluit uit mijn php-log:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[...snip...]
0.19787900 1044368675 (www.seno.lan)/img/navigatie/infoalgemeen.gif        
0.19928700 1044368675 (www.seno.lan)/img/navigatie/infoalgemeen2.gif       
0.21129500 1044368675 (www.seno.lan)/img/navigatie/infoorganisaties.gif    
0.21543000 1044368675 (www.seno.lan)/img/navigatie/infoberoepskrachten.gif <---------
0.21627400 1044368675 (www.seno.lan)/img/navigatie/infoorganisaties2.gif <---------  
0.21766600 1044368675 (www.seno.lan)/img/navigatie/infoberoepskrachten2.gif
0.22071700 1044368675 (www.seno.lan)/img/navigatie/trainingen.gif          
0.39099500 1044368675 (www.seno.lan)/img/navigatie/trainingen2.gif         
0.39237400 1044368675 (www.seno.lan)/img/navigatie/infoopvoeders2.gif      
0.39416200 1044368675 (www.seno.lan)/img/navigatie/infoopvoeders.gif       
0.39767000 1044368675 (www.seno.lan)/img/navigatie/projecten.gif           
0.40905300 1044368675 (www.seno.lan)/img/navigatie/projecten2.gif          
0.41043800 1044368675 (www.seno.lan)/img/navigatie/mediatheek2.gif         
0.41234500 1044368675 (www.seno.lan)/img/navigatie/mediatheek.gif          
[...snip...]


Zoals je ziet krijgt mijn script de urls aangeboden in de volgorde van
"Applying pattern...", maar worden de antwoorden in een andere
volgorde geinterpreteerd.


Nogmaals sorry voor de layout... ;-)

[ Voor 6% gewijzigd door kvdveer op 04-02-2003 14:52 . Reden: Pijltjes toegevoegd ]

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023
Opgelost!

http://httpd.apache.org/d..._rewrite.html#RewriteLock

Als je een programma gebruikt, moet je rewritelock specificeren. Dat heb ik nu gedaan, en het draait als een zonnetje.

Als dit systeem productie draait (waarschijnlijk deze zomer) ga ik even vergelijken hoe het zit met de performance...

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 17-09 22:52
't lijkt erop... toch kriebelt er nog ergens iets. dat log van php, dat geeft aan wat-ie naar apache retourneert ? niet wat-ie krijgt ?

om nog verde te debuggen zou je 't RewriteLogLevel kunnen verhogen, dan geeft apache er ook procesnummers bij (hij heeft natuurlijk meerdere child-processes lopen). ook eventueel apache opstarten als 'httpd -F -X', dan is er maar _een_ proces, en blijft in de foreground.
nog een kleinigheidje uit de code hierboven :

$result = http404_file;

kan niet, moet vast

$result = $http404_file;

zijn.

verder _zou_ je gewoon met een statische domain-map kunnen maken om te zien of 't dan ook fout gaat.

edit:
te laat... oh well, 't is opgelost :)

[ Voor 7% gewijzigd door tech-no-logical op 04-02-2003 15:14 ]


Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023
tech-no-logical schreef op 04 februari 2003 @ 15:12:
nog een kleinigheidje uit de code hierboven :

$result = http404_file;

kan niet, moet vast

$result = $http404_file;

zijn.
edit:
te laat... oh well, 't is opgelost :)
Nee. http404_file is gedefinieerd met define...

Bedankt voor je hulp trouwens.

Localhost, sweet localhost

Pagina: 1