Pagina 1 van 1

Apache rewrite rules > 400 Bad Request

Geplaatst: 20 aug 2020, 20:29
door meon
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

Re: Apache rewrite rules > 400 Bad Request

Geplaatst: 20 aug 2020, 21:42
door Splitter
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]

Re: Apache rewrite rules > 400 Bad Request

Geplaatst: 20 aug 2020, 23:16
door meon
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]

Re: Apache rewrite rules > 400 Bad Request

Geplaatst: 20 aug 2020, 23:42
door Splitter
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.

Re: Apache rewrite rules > 400 Bad Request

Geplaatst: 21 aug 2020, 08:21
door Goztow
Pas op want phpbb doet misschien ook al zoiets waardoor die twee wat tegen elkaar zouden kunnen 'vechten'.

Re: Apache rewrite rules > 400 Bad Request

Geplaatst: 21 aug 2020, 16:03
door meon
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

Re: Apache rewrite rules > 400 Bad Request

Geplaatst: 21 aug 2020, 20:25
door Splitter
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]

Re: Apache rewrite rules > 400 Bad Request

Geplaatst: 22 aug 2020, 20:56
door meon
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.

Re: Apache rewrite rules > 400 Bad Request

Geplaatst: 22 aug 2020, 21:30
door Splitter
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)

Re: Apache rewrite rules > 400 Bad Request

Geplaatst: 22 aug 2020, 22:16
door meon
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.

Re: Apache rewrite rules > 400 Bad Request

Geplaatst: 22 aug 2020, 23:18
door Splitter
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.