Apache-Umschreibregel mit Präfix „DocumentRoot“

Apache-Umschreibregel mit Präfix „DocumentRoot“

Ich habe die folgende Konfiguration für einen VirtualHost:

<VirtualHost *:80>
    DocumentRoot /srv/emptywebroot
    <Directory /srv/emptywebroot>
        Require all denied
    </Directory>

    # Dashboard proxy
    RewriteEngine on
    LogLevel alert rewrite:trace6
    RewriteCond %{HTTP:Upgrade} =websocket
    RewriteRule /dashboard/(.*) ws://dashboard:3838/dashboard/$1 [P,L]
    RewriteCond %{HTTP:Upgrade} !=websocket
    RewriteRule /dashboard/(.*) http://dashboard:3838/dashboard/$1 [P,L]
    ProxyPreserveHost on
    ProxyPassReverse /dashboard http://dashboard:3838/dashboard
</VirtualHost>

Beim Besuch http://myurl/dashboarderhalte ich eine 404-Meldung vom Dashboard-Backend.

Wenn ich die Umschreibprotokolle überprüfe, erhalte ich:

[Wed Mar 21 14:04:08.051070 2018] [rewrite:trace2] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] init rewrite engine with requested uri /dashboard/
[Wed Mar 21 14:04:08.051114 2018] [rewrite:trace1] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] pass through /dashboard/
[Wed Mar 21 14:04:08.051176 2018] [rewrite:trace3] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] add path info postfix: /srv/emptywebroot/dashboard -> /srv/emptywebroot/dashboard/
[Wed Mar 21 14:04:08.051186 2018] [rewrite:trace3] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] applying pattern '(.*)' to uri '/srv/emptywebroot/dashboard/'
[Wed Mar 21 14:04:08.051199 2018] [rewrite:trace4] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] RewriteCond: input='' pattern='=websocket' => not-matched
[Wed Mar 21 14:04:08.051208 2018] [rewrite:trace3] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] add path info postfix: /srv/emptywebroot/dashboard -> /srv/emptywebroot/dashboard/
[Wed Mar 21 14:04:08.051216 2018] [rewrite:trace3] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] applying pattern '(.*)' to uri '/srv/emptywebroot/dashboard/'
[Wed Mar 21 14:04:08.051225 2018] [rewrite:trace4] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] RewriteCond: input='' pattern='!=websocket' => matched
[Wed Mar 21 14:04:08.051234 2018] [rewrite:trace2] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] rewrite '/srv/emptywebroot/dashboard/' -> 'http://dashboard:3838//srv/emptywebroot/dashboard/'
[Wed Mar 21 14:04:08.051243 2018] [rewrite:trace2] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] escaped URI in per-dir context for proxy, http://dashboard:3838//srv/emptywebroot/dashboard/ -> http://dashboard:3838//srv/emptywebroot/dashboard/
[Wed Mar 21 14:04:08.051264 2018] [rewrite:trace2] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] forcing proxy-throughput with http://dashboard:3838//srv/emptywebroot/dashboard/
[Wed Mar 21 14:04:08.051272 2018] [rewrite:trace1] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] go-ahead with proxy request proxy:http://dashboard:3838//srv/emptywebroot/dashboard/ [OK]

Wird also /srv/emptywebrootvor der Übergabe der URI an den Proxy mit einem Präfix versehen. Ich möchte, dass dies nicht mit einem Präfix versehen wird. Ich habe es RewriteBase /und einige andere Dinge versucht, aber ich verstehe den Sinn nicht.

Wie kann ich vermeiden, dass der URI in diesem Kontext „DocumentRoot“ vorangestellt wird?

BEARBEITEN 1: Das Dashboard-Backend unter Dashboard:3838 wird nicht von Apache bereitgestellt, sondern ist ein Shiny-Server (https://shiny.rstudio.com/). Ich habe einen TCPdump auf dem Host des Dashboards ausgeführt und es passiert das, was oben zu sehen ist: DocumentRoot wird mit dem Proxy-Virtualhost von Apache vorangestellt, sodass das Backend nachhttp://dashboard:3838//srv/emptywebroot/dashboard, anstatthttp://dashboard:3838/dashboardwie ich es brauche. Ich hoffe, das klärt meine Situation, also formuliere ich die Frage neu: Wie weise ich mod_rewrite an, lokale Pfade nicht aufzulösen (mit dem Präfix DocumentRoot)? In meinem Fall ist dies ein mod_rewrite-Proxy (prüfen Sie das [P] bei der Rewrite-Regel, daher ist das Präfixieren lokaler Pfade nicht mein gewünschtes Verhalten).

Antwort1

Laut dem Rewrite Log wurden diese Zeilen Ihres Regelsatzes getroffen

RewriteCond %{HTTP:Upgrade} !=websocket
RewriteRule /dashboard/(.*) http://dashboard:3838/dashboard/$1 [P,L]

Da dies RewriteRuleein [L]Flag hat, werden die nächsten Zeilen nicht mehr überprüft

Jetzt gelangt diese Anfrage in die nächste Umschreiberunde. <VirtualHost dashboard:3838> Dort können Sie nachschauen, warum Ihre URI /dashboard/zu einem HTTP-Fehler 404 führt.

  • Existiert dieses Verzeichnis?
  • Gibt es eine RewriteRule, die das Problem lösen kann?

Antwort2

Ich habe herausgefunden, dass das Problem gelöst wird, indem man die Rewriter-Regel zwingt, mit REQUEST_URI übereinzustimmen, indem man vorher eine Rewrite-Bedingung zu REQUEST_URI hinzufügt. Daher funktioniert das Folgende für mich:

<VirtualHost *:80>
    DocumentRoot /srv/emptywebroot
    <Directory /srv/emptywebroot>
        Require all denied
    </Directory>

    # Dashboard proxy
    RewriteEngine on
    LogLevel alert rewrite:trace6
    RewriteCond %{HTTP:Upgrade} =websocket
    RewriteCond %{REQUEST_URI} ^/dashboard
    RewriteRule /dashboard/(.*) ws://dashboard:3838/dashboard/$1 [P,L]
    RewriteCond %{HTTP:Upgrade} !=websocket
    RewriteCond %{REQUEST_URI} ^/dashboard
    RewriteRule /dashboard/(.*) http://dashboard:3838/dashboard/$1 [P,L]
    ProxyPreserveHost on
    ProxyPassReverse /dashboard http://dashboard:3838/dashboard
</VirtualHost>

Ich habe die Dokumentation gefunden unterhttp://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteruleetwas verwirrend, da es heißt: „Im VirtualHost-Kontext wird das Muster zunächst mit dem Teil der URL nach dem Hostnamen und Port und vor der Abfragezeichenfolge abgeglichen (z. B. „/app1/index.html“). Dies ist der (%-dekodierte) URL-Pfad.“, aber in meinem Fall scheint es stattdessen mit dem lokal aufgelösten Pfad abzugleichen. Das Hinzufügen eines RewriteCond zum Ändern dessen, was die RewriteRule neu schreibt (in meinem Fall REQUEST_URI), scheint also zu funktionieren.

verwandte Informationen