Grundlegendes zu Apache 2.4 mod_proxy_fcgi und RewriteRules in htaccess

9

Wir haben kürzlich einen unserer Webserver auf Apache 2.4 umgestellt und PHP über php-fpm und mod_proxy_fcgi ausgeführt. Fast alles funktioniert ganz gut, aber es gibt ein Problem, das ich noch nicht verstehe. Auf einer unserer Websites wird WordPress ausgeführt, das eine gute Liste von Umschreiberegeln in der .htaccess-Datei enthält. Und es scheint, dass diese mit der ProxyPass-Direktive im vhost-Setup nicht so gut funktionieren.

Unser vhost enthält folgende Konfiguration:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1

Dies funktioniert in den meisten Fällen.

Die htaccess-Datei führt nun unter anderem Folgendes aus:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule  ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule  ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

Da es sich bei der Site um ein Multiblog in Unterverzeichnissen handelt, habe ich gelesen, dass die URL /blogname/wp-admin/load-styles.php?xxxx als wp-admin / load-styles.php? Xxx (die zweite Umschreiberegel) umgeschrieben werden sollte. Wenn Sie sich jedoch das mod_proxy-Protokoll ansehen, lautet die tatsächlich übergebene Anforderung /blogname/wp-admin/load-styles.php.

Ich habe dies gelesen, da es ein Vorrangproblem gibt - die ProxyPass-Regel wird ausgelöst, bevor alle RewriteRules bearbeitet wurden.

Ich bin geschwächt - was kann die Ursache sein?

Konrad Neuwirth
quelle
Haben Sie versucht, die Umschreibungen eher im vhost als im .htaccess zu platzieren? (
Stellen
Dies könnte nur eine Notlösung sein: Die Software, die die Umschreiberegeln schreibt, ist WordPress selbst. Es wird verwendet, um die Regeln von Zeit zu Zeit zu aktualisieren (und sei es während eines Updates), sodass ich sie nicht vollständig vor dem Webspace verbergen kann.
Konrad Neuwirth
@KonradNeuwirth Funktioniert es ordnungsgemäß, wenn Sie unter den anderen Regeln zum Proxying über a RewriteRulemit dem [P]Flag wechseln ?
Shane Madden

Antworten:

12

Ich habe diese Lösung gefunden, ich weiß nicht, ob der beste Weg ist, aber sie funktioniert für mich.

  1. Entfernen Sie die Linie:

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1
    
  2. Fügen Sie dies in Ihre Direktive ein:

    <Directory /var/www/yoursiste.com>
        Options -Indexes +FollowSymLinks -ExecCGI +MultiViews
    
        AllowOverride All
    
        <IfModule mod_proxy_fcgi.c>
            RewriteEngine On
            RewriteBase /
            RewriteOptions InheritBefore
            RewriteCond %{REQUEST_FILENAME} -f
            RewriteRule ^([^\.]+\.php)$ fcgi://127.0.0.2:9126/var/www/yoursite.com/$1 [L,P]
        </IfModule>
    
        Order allow,deny
        allow from all
    
        <IfVersion >= 2.4>
            Require all granted
        </IfVersion>
    </Directory>
    

    Alle echten PHP-Dateien werden zum fcgi-Proxy umgeleitet.

    Und die " RewriteOptions InheritBefore " Dies zwingt die aktuelle Konfiguration, die Konfiguration des übergeordneten Elements zu erben, wird jedoch vor den im untergeordneten Bereich angegebenen Regeln angewendet (.htaccess im Verzeichnis). Ist die einzige Möglichkeit, die Kompatibilität zwischen der fcgi-Konfiguration und der .htaccess-Konfiguration des Clients zu finden.

  3. Um andere Parameter zu steuern, die Sie möglicherweise für den Proxy benötigen:

    <IfModule mod_proxy_fcgi.c>
        <Proxy fcgi://127.0.0.2:9126>
            ProxySet timeout=1800 disablereuse=on
        </Proxy>
    </IfModule>
    
Gabriel Pérez S.
quelle
2

Mit ProxyPassMatchwerden .htaccessDateien ignoriert. Versuchen Sie es mit FilesMatchund SetHandlerstattdessen, wie hier und hier beschrieben .

Peter Nowee
quelle
Bitte posten Sie nicht genau dieselbe Antwort mehrmals. Stimmen Sie die Fragen stattdessen gegebenenfalls als doppelt ab.
Sven
Das habe ich gesucht. Es erlaubt die Verwendung von mod_rewrite im htaccess-Kontext.
David
0

Verschieben Sie die Umschreibungslogik in die ProxyPassMatch-Ausdrücke. Fügen Sie zwei zusätzliche ProxyPassMatch-Zeilen vor der in Ihrer vhost-Konfiguration hinzu:

ProxyPassMatch ^/([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes)/.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/<path>/$2    
ProxyPassMatch ^/([_0-9a-zA-Z-]+/)?(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/<path>/$2
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/<path>/$1
Marshall
quelle