Apache rewrite rules > 400 Bad Request

Alles over programmeren en development binnen de IT-wereld
Plaats reactie
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

Ok, ik geef toe, ik snap niets van reguliere expressies. Mijn kennis beperkt zich tot "copy/paste een voorbeeld". In onderstaand geval gebaseerd op de oude Joomla!-installatie die Userbase ooit gebruikt heeft.

Mijn doel: fysieke files op het filesysteem mogen rechtstreeks benaderd worden en al de rest moet rewritten worden naar /index.php?<originele URI>.
Voorbeeld: https://userbase.be/foo -> https://userbase.be/index.php?foo . Indien in de oorspronkelijke URI een query string zat mag die ook toegevoegd worden, al is dat (op dit moment) niet nodig.

in de Apache 2.4-config-file heb ik staan:

Code: Selecteer alles

RewriteEngine On
########## Begin - Rewrite rules to block out some common exploits
## If you experience problems on your site block out the operations listed below
## This attempts to block the most common type of exploit `attempts` to Joomla!
#
# Block out any script trying to set a mosConfig value through the URL
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]
# Block out any script trying to base64_encode crap to send via URL
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]
# Block out any script that includes a <script> tag in URL
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
# Block out any script trying to set a PHP GLOBALS variable via URL
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
# Block out any script trying to modify a _REQUEST variable via URL
# Send all blocked request to homepage with 403 Forbidden error!
RewriteRule ^(.*)$ index.php [F,L]
#
########## End - Rewrite rules to block out some common exploits

#  Uncomment following line if your webserver's URL
#  is not directly related to physical file paths.
#  Update Your Joomla! Directory (just / for root)

# RewriteBase /

########## Begin - Joomla! core SEF Section
#
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$  [NC]
RewriteRule (.*) index.php
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
#
########## End - Joomla! core SEF Section
Helaas krijg ik hier een error 400 Bad Request mee als ik een url zoals "/foo" opvraag. Enkel de root "/" lijkt te werken.
Met trace5-level logging krijg ik:

Code: Selecteer alles

init rewrite engine with requested uri /foo
applying pattern '^(.*)$' to uri '/foo'
RewriteCond: input='' pattern='mosConfig_[a-zA-Z_]{1,21}(=|\\%3D)' => not-matched
RewriteCond: input='' pattern='base64_encode.*\\(.*\\)' => not-matched
RewriteCond: input='' pattern='(\\<|%3C).*script.*(\\>|%3E)' [NC] => not-matched
RewriteCond: input='' pattern='GLOBALS(=|\\[|\\%[0-9A-Z]{0,2})' => not-matched
RewriteCond: input='' pattern='_REQUEST(=|\\[|\\%[0-9A-Z]{0,2})' => not-matched
applying pattern '(.*)' to uri '/foo'
RewriteCond: input='/foo' pattern='!-f' => matched
RewriteCond: input='/foo' pattern='!-d' => matched
RewriteCond: input='/foo' pattern='!^/index.php' => matched
RewriteCond: input='/foo' pattern='(/|\\.php|\\.html|\\.htm|\\.feed|\\.pdf|\\.raw|/[^.]*)$' [NC] => matched
rewrite '/foo' -> 'index.php'
applying pattern '.*' to uri 'index.php'
setting env variable 'HTTP_AUTHORIZATION' to ''
local path result: index.php
Gebruikersavatar
Splitter
Elite Poster
Elite Poster
Berichten: 5918
Lid geworden op: 10 maa 2010, 12:30
Uitgedeelde bedankjes: 68 keer
Bedankt: 605 keer
Te Koop forum

probeer eens dit :

Code: Selecteer alles

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule (.*) index.php
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
te vervangen door dit:

Code: Selecteer alles

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^(.*)$ /index.php?$1 [NC,L,QSA]
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

Cool! Al beter, maar nog niet helemaal.
chrome_20200820-200718_pE5p.png
Het forum werkt nog niet op deze manier, terwijl /forum/viewtopic.php echt wel bestaat...

Code: Selecteer alles

init rewrite engine with requested uri /forum/viewtopic.php
applying pattern '^(.*)$' to uri '/forum/viewtopic.php'
RewriteCond: input='f=43&p=837700&view=unread' pattern='mosConfig_[a-zA-Z_]{1,21}(=|\\%3D)' => not-matched
RewriteCond: input='f=43&p=837700&view=unread' pattern='base64_encode.*\\(.*\\)' => not-matched
RewriteCond: input='f=43&p=837700&view=unread' pattern='(\\<|%3C).*script.*(\\>|%3E)' [NC] => not-matched
RewriteCond: input='f=43&p=837700&view=unread' pattern='GLOBALS(=|\\[|\\%[0-9A-Z]{0,2})' => not-matched
RewriteCond: input='f=43&p=837700&view=unread' pattern='_REQUEST(=|\\[|\\%[0-9A-Z]{0,2})' => not-matched
applying pattern '^(.*)$' to uri '/forum/viewtopic.php'
RewriteCond: input='/forum/viewtopic.php' pattern='!-f' => matched
RewriteCond: input='/forum/viewtopic.php' pattern='!-d' => matched
RewriteCond: input='/forum/viewtopic.php' pattern='!^/index.php' => matched
RewriteCond: input='/forum/viewtopic.php' pattern='(/|\\.php|\\.html|\\.htm|\\.feed|\\.pdf|\\.raw|/[^.]*)$' [NC] => matched
rewrite '/forum/viewtopic.php' -> '/index.php?/forum/viewtopic.php'
split uri=/index.php?/forum/viewtopic.php -> uri=/index.php, args=/forum/viewtopic.php&f=43&p=837700&view=unread
local path result: /index.php
prefixed with document_root to /var/www/userbase.be/index.php
go-ahead with /var/www/userbase.be/index.php [OK]
Gebruikersavatar
Splitter
Elite Poster
Elite Poster
Berichten: 5918
Lid geworden op: 10 maa 2010, 12:30
Uitgedeelde bedankjes: 68 keer
Bedankt: 605 keer
Te Koop forum

voor het slapengaan, een beetje een 'hack':

Code: Selecteer alles

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} !^/forum/viewtopic.php
RewriteRule ^(.*)$ /index.php?$1 [NC,L,QSA]
eigenlijk zou je moeten kijken waarom hij viewtopic.php niet wil matchen als file, maar dit zou ook moeten werken in de tussentijd.


EDIT:

RewriteCond: input='/forum/viewtopic.php' pattern='(/|\\.php|\\.html|\\.htm|\\.feed|\\.pdf|\\.raw|/[^.]*)$' [NC] => matched
je rewriterule RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ [NC] moet eruit.
Gebruikersavatar
Goztow
Administrator
Administrator
Berichten: 15182
Lid geworden op: 14 nov 2006, 16:21
Locatie: Brussel
Uitgedeelde bedankjes: 1687 keer
Bedankt: 1484 keer
Recent bedankt: 8 keer
Provider
Te Koop forum

Pas op want phpbb doet misschien ook al zoiets waardoor die twee wat tegen elkaar zouden kunnen 'vechten'.
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

Splitter schreef:RewriteCond: input='/forum/viewtopic.php' pattern='(/|\\.php|\\.html|\\.htm|\\.feed|\\.pdf|\\.raw|/[^.]*)$' [NC] => matched
je rewriterule RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ [NC] moet eruit.
Als ik die in commentaar zet heb ik zelfde gedrag én werkten de images en CSS niet meer, want die worden ook rewritten naar index.php.

Het is overigens niet enkel die viewtopic.php die het niet doet, maar elke php-pagina, ook op de root.
Goztow schreef:Pas op want phpbb doet misschien ook al zoiets waardoor die twee wat tegen elkaar zouden kunnen 'vechten'.
Zou kunnen, in /forum staat in de .htaccess:

Code: Selecteer alles

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ app.php [QSA,L]
Maar ik heb 't gevoel dat we niet eens tot daar raken op dit moment...
zelfs een https://userbase.be/phpinfo.php doet het niet.

//edit: voor de duidelijkheid, ik ben dit niet in productie aan het doen hé :P
Gebruikersavatar
Splitter
Elite Poster
Elite Poster
Berichten: 5918
Lid geworden op: 10 maa 2010, 12:30
Uitgedeelde bedankjes: 68 keer
Bedankt: 605 keer
Te Koop forum

meon schreef:
Splitter schreef:RewriteCond: input='/forum/viewtopic.php' pattern='(/|\\.php|\\.html|\\.htm|\\.feed|\\.pdf|\\.raw|/[^.]*)$' [NC] => matched
je rewriterule RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ [NC] moet eruit.
Als ik die in commentaar zet heb ik zelfde gedrag én werkten de images en CSS niet meer, want die worden ook rewritten naar index.php.
lijkt me heel bizar want die lijn matcht toch niet op jpg of css ?
meon schreef: Het is overigens niet enkel die viewtopic.php die het niet doet, maar elke php-pagina, ook op de root.
hmmm.... ik ga eens even kijken of ik het kan nabootsen

EDIT: je laat die joomla "beveiliging" staan... die zorgt voor het issue.
probeer dit eens als volledige code?

Code: Selecteer alles

RewriteEngine On
#RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$  [NC]
RewriteRule ^(.*)$ /index.php?$1 [NC,L,QSA]
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

Ik heb alle Joomla!-code weggehaald en enkel bovenstaande gezet als rewrite-rule...
Zelfde gedrag :(.

Ik snap 't niet, waarom werkt het hier op Userbase.be wél, maar niet op m'n dev-omgeving?
Op productie wordt de rule wel vanuit een .htaccess geladen en op dev heb ik 't in de .conf-file van de virtual host van Apache gezet.
Ook een verschil is Apache 2.2 <> 2.4.

Ik kan dus met bovenstaande code wel m'n 'virtuele' url's opvragen zoals /nieuws en /disclaimer, maar geen /phpinfo.php of /forum.
Gebruikersavatar
Splitter
Elite Poster
Elite Poster
Berichten: 5918
Lid geworden op: 10 maa 2010, 12:30
Uitgedeelde bedankjes: 68 keer
Bedankt: 605 keer
Te Koop forum

meon schreef: Op productie wordt de rule wel vanuit een .htaccess geladen en op dev heb ik 't in de .conf-file van de virtual host van Apache gezet.
misschien heel dom... maar... als je de code in een vhost zet, doe je dat dan ook in een <directory /var/www/ergens>CODE</directory> blok?
(want ja, voor apache is rewrite anders in een htaccess (gelijk aan directory) of in een vhost (buiten de directory)
een van de redenen dat ik persoonlijk htaccess verkies (de andere is omdat je dan je apache niet elke keer dient te herladen bij een wijziging)
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

Hmmmm...

Ik had de rewrite-rules buiten <Directory /> staan, binnen <VirtualHost *:443>.
Dat betekent dan dat de rewrite-rules relatief worden geëvalueerd tov élke directory?

Ik dacht dat ik het, door in de .conf te beheren makkelijker een refresh kon doen zonder al te veel te moeten aanpassen.

Iets dat ik ondertussen weer moet doen, want m'n upgrade voor het forum is weer de soep in gedraaid :-).
Ik zal zien of de .htaccess-methode gewoon werkt dan.
Gebruikersavatar
Splitter
Elite Poster
Elite Poster
Berichten: 5918
Lid geworden op: 10 maa 2010, 12:30
Uitgedeelde bedankjes: 68 keer
Bedankt: 605 keer
Te Koop forum

meon schreef:Hmmmm...

Ik had de rewrite-rules buiten <Directory /> staan, binnen <VirtualHost *:443>.
Dat betekent dan dat de rewrite-rules relatief worden geëvalueerd tov élke directory?
van https://httpd.apache.org/docs/current/m ... ewriterule :
In VirtualHost context, The Pattern will initially be matched against the part of the URL after the hostname and port, and before the query string (e.g. "/app1/index.html"). This is the (%-decoded) URL-path.

In per-directory context (Directory and .htaccess), the Pattern is matched against only a partial path, for example a request of "/app1/index.html" may result in comparison against "app1/index.html" or "index.html" depending on where the RewriteRule is defined.

The directory path where the rule is defined is stripped from the currently mapped filesystem path before comparison (up to and including a trailing slash). The net result of this per-directory prefix stripping is that rules in this context only match against the portion of the currently mapped filesystem path "below" where the rule is defined.

Directives such as DocumentRoot and Alias, or even the result of previous RewriteRule substitutions, determine the currently mapped filesystem path.
Plaats reactie

Terug naar “Development”