Comprensione di apache 2.4 mod_proxy_fcgi e RewriteRules in htaccess


9

Di recente abbiamo convertito uno dei nostri server Web in apache 2.4 ed eseguendo PHP tramite php-fpm e mod_proxy_fcgi. Quasi tutto funziona abbastanza bene, ma c'è un problema che non capisco ancora. Uno dei nostri siti esegue WordPress, che porta un buon elenco di regole di riscrittura nel suo file .htaccess. E sembra che quelli non funzionino così bene con la direttiva ProxyPass nella configurazione del vhost.

Il nostro vhost contiene la seguente configurazione:

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

Questo funziona nella maggior parte dei casi.

Ora, il file htaccess fa, tra l'altro, questo:

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]

Poiché il sito è un multiblog in sottodirectory, ho letto che l'URL /blogname/wp-admin/load-styles.php?xxxx dovrebbe essere riscritto come wp-admin / load-styles.php? Xxx (la seconda regola di riscrittura). Ma guardando il registro mod_proxy, la richiesta che viene effettivamente passata è /blogname/wp-admin/load-styles.php.

Ho letto questo perché c'è un problema di precedenza: la regola ProxyPass viene attivata prima che tutte le RewriteRules siano state risolte.

Sono ostacolato - quale può essere la causa?


Hai provato a mettere le riscritture nel vhost anziché nel .htaccess? (Assicurati di occuparti della barra iniziale se lo fai.)
Ladadadada,

Questa potrebbe essere solo una soluzione di stopgap: il software che scrive le regole di riscrittura è WordPress stesso. Viene utilizzato per aggiornare le regole di tanto in tanto (e sia nel corso di un aggiornamento), quindi non posso nasconderle totalmente dallo spazio web.
Konrad Neuwirth,

@KonradNeuwirth Funziona correttamente quando si passa al proxy tramite a RewriteRulecon la [P]bandiera, sotto le altre regole?
Shane Madden,

Risposte:


12

Ho trovato questa soluzione, non so se sia il modo migliore, ma funziona per me.

  1. Rimuovi la linea:

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1
    
  2. Aggiungi questo nella tua direttiva:

    <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>
    

    Tutti i file php reali verranno reindirizzati al proxy fcgi.

    E " RewriteOptions InheritBefore " Questo forza la configurazione corrente ad ereditare la configurazione del genitore, ma viene applicata prima delle regole specificate nell'ambito secondario (.htaccess nella directory). È l'unico modo in cui ho scoperto la compatibilità tra la configurazione di fcgi e la configurazione del client .htaccess.

  3. Per controllare altri parametri che potrebbero essere necessari per il proxy:

    <IfModule mod_proxy_fcgi.c>
        <Proxy fcgi://127.0.0.2:9126>
            ProxySet timeout=1800 disablereuse=on
        </Proxy>
    </IfModule>
    

2

Con ProxyPassMatch, i .htaccessfile vengono ignorati. Prova a usare FilesMatche SetHandlerinvece, come descritto qui e qui .


Si prega di non pubblicare la stessa risposta esatta più volte. Invece, quando applicabile, vota / contrassegna le domande come duplicate.
Sven

Questo è quello che stavo cercando. Permette di usare mod_rewrite in un contesto htaccess.
David,

0

Spostare la logica di riscrittura nelle espressioni ProxyPassMatch. Aggiungi due righe ProxyPassMatch aggiuntive prima di quella nella configurazione del tuo vhost come segue:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.