Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[mod_rewrite] Apache 99% cpu en pagina laadt niet

Pagina: 1
Acties:
  • 1.405 views sinds 30-01-2008
  • Reageer

  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Er is prachtige documentatie te vinden over .htaccess en mod_rewrite, maar ik zit nu al uren te klooien met een probleem waardoor ik pas om 12 uur pannekoeken gegeten heb, en nog belet dit stukje onbegrip van mijn kant mij om me met belangrijkere creatieve zaken bezig te houden.

De .htaccess in kwestie was aan de ingewikkelde kant dus ik dacht dat het een domme fout van mij was, maar inmiddels heb ik het helemaal uitgekleed tot één raadsel.

Ik wil met behulp van de rewrite_engine een querystring doorpasen aan index.php als de URL een querystring bevat of als het opgevraagde GEEN bestand is.

Daarvoor heb ik twee regels bedacht:
code:
1
2
RewriteCond %{QUERY_STRING} ^.+$
RewriteRule $ "/rewrite/index.php?foo=Query+String+Detected!" [L,QSA]

en
code:
1
2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule $ "/rewrite/index.php?bar=That+is+no+file!" [L,QSA]


Ze werken allebei los van elkaar zoals ik wil. Maar bij elkaar blijft de pagina laden (en laat niets zien). Ik krijg niet eens 500 Internal Server Error melding, gewoon mijn page blijft laden en als je dan in taakbeheer kijkt zie je dat Apache.exe 99% van de processor gebruikt en de swap wordt met de seconde groter.

Afbeeldingslocatie: http://stuff.rednet.nl/rommel/Screens/ApacheFrop.png

Het lijkt op een oneindige loop van apache die de request aan het rewriten is, maar als ik naar de rules kijk zie ik dat er niet vanaf.

Hierbij de code van een aantal zaken die ik in .htaccess geprobeert heb. '/' being the document root:

/rewrite/index.php
code:
1
2
3
4
<?php
echo '<pre>';
print_r($_GET);
echo '</pre>';


/rewrite/index.php
code:
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
26
27
28
# testende aap

RewriteEngine On 
RewriteBase "/"

#Deze alleen werkt
RewriteCond %{QUERY_STRING} ^.+$
RewriteRule $ "/rewrite/index.php?foo=Query+String+Detected!" [L,QSA]

#Deze alleen werkt
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule $ "/rewrite/index.php?bar=That+is+no+file!" [L,QSA]

#Maar samen werken ze NIET, ook als je de regels omdraait werken ze niet
#RewriteCond %{QUERY_STRING} ^.+$
#RewriteRule $ "/rewrite/index.php?foo=Query+String+Detected!" [L,QSA]
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule $ "/rewrite/index.php?bar=That+is+no+file!" [L,QSA]

#Volstaand voor mijn doeleinden kwam ik tot dit, maar deze werkt NIET, ook niet als je de Conditions omdraait
#RewriteCond %{QUERY_STRING} ^.+$ [OR]
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule $ "/rewrite/index.php?baz=Geen+bestand+en/of+wel+een+Query+String!" [L,QSA]

#En deze (impliciete [AND]) werkt ook NIET
#RewriteCond %{QUERY_STRING} ^.+$
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule $ "/rewrite/index.php?baz=Geen+bestand+en/of+wel+een+Query+String!" [L,QSA]


Wie kan hier licht op schijnen?


-edit-

Even ten overvloede, de output zou zoiets als dit moeten zijn:
(http://127.0.0.1/rewrite/index.php)
Array
(
)

(http://127.0.0.1/rewrite/index.php?Redsandro=true)
Array
(
[foo] => Query String Detected!
)

(http://127.0.0.1/rewrite/)
Array
(
[bar] => That is no file!
)

[ Voor 7% gewijzigd door Sando op 06-08-2007 03:13 . Reden: html output voorbeeldje ]

🇪🇺 Buy from EU (GoT)


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Waarom zo moeilijk doen?
Als een bestand niet bestaat krijg je een 404, laat Apache het nou toestaan om zelf een error pagina in te laten stellen, en dat kan dan weer een php bestand zijn, vziw.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 13:11
Je bent een endless-loop aan het bouwen.Als je lang genoeg wacht zou je wel een 500 error moeten krijgen met die melding, mits je server daarop geconfigureerd is.

"RewriteCond %{QUERY_STRING} ^.+$" matched alles, ook de string waarnaar je rewrite. Exclude die eensi n je RewriteCond

ErrorDocument 404 "/rewrite/index.php?bar=That+is+no+file!" is inderdaad netter om te gebruiken als 404-oplossing.

[ Voor 16% gewijzigd door frickY op 06-08-2007 08:40 ]


  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Bedankt voor de tips, maar dat is niet wat ik zoek. Het gaat hier niet om een 404 oplossing. Die vang ik al af in het on-uitgeklede .htaccess bestand. Als je 404 gebruikt krijg je alleen een foutmelding als het pad of bestand niet bestaat. Dus NIET wanneer ik http://127.0.0.1/rewrite/ in de url zet. Dan auto-load ie index.php. Maar dan wil ik dat index.php weet dat ie niet direct is aangesproken.

@frickY

Waarom matcht RewriteCond %{QUERY_STRING} ^.+$ alles? Er staat toch: 'Als de querystring één of meer tekens bevat'? Volgens mij matcht ie alleen de querystring, en als die er niet is matcht ie niets. En al is het niet zoals ik het bedoel en hij matcht altijd, dan voert ie toch gewoon de volgende RewriteRule uit en gaat ie verder?

Ik zie zag het probleem niet, hoewel die er obviously wel is en je berteft de infinite loop gelijk lijkt te hebben. Via via kwam ik met een google naar infinite loop weer bij die docs,
(...) Remember, however, that if the RewriteRule generates an internal redirect (which frequently occurs when rewriting in a per-directory context), this will reinject the request and will cause processing to be repeated starting from the first RewriteRule.
(Nu bedenk ik me dat je dat waarschijnlijk bedoelde, in dat geval begreep ik je verkeerd.)

Dat maakt sense. Ik zal nu gaan nadenken over een geheime truukje om toch die querystring een rewrite te laten veroorzaken zonder dat ie iedere keer opnieuw wordt getriggert. Meedenken wordt zeer op prijs gesteld. :D

[ Voor 3% gewijzigd door Sando op 06-08-2007 13:19 ]

🇪🇺 Buy from EU (GoT)


  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Ik schaam me dood dat ik nu de oplossing al heb.. gister ben ik met de oorspronkelijke .htaccess vier uur bezig geweest en jah.. als je het niet snapt is de combinatie van GoT en slaap het beste.

Anyway, bedankt voor het schopje in de goede richting! Het wordt allemaal een stuk logischer als je eens te meer beseft dat elke interne redirect ([L]) zorgt voor OPNIEUW rewriten.

Zo heb ik de querystring regel voor elkaar:
code:
1
2
3
RewriteCond %{QUERY_STRING} ^.+$
RewriteCond %{REQUEST_URI} !^/rewrite/index.php$
RewriteRule $ "/rewrite/index.php?foo=Query+String+Detected!" [L,QSA]
Die 2e conditie maakt dat ie simpelweg niet opnieuw herschreven wordt. Enige nadeel van deze manier is dat een querystring achter index.php niet gedetecteerd wordt, maar dat heb ik ook niet nodig. _/-\o_

[ Voor 14% gewijzigd door Sando op 06-08-2007 13:46 ]

🇪🇺 Buy from EU (GoT)