Memahami apache 2.4 mod_proxy_fcgi dan RewriteRules di htaccess

9

Kami baru-baru ini mengganti salah satu server web kami ke apache 2.4 dan menjalankan PHP melalui php-fpm dan mod_proxy_fcgi. Kebanyakan semuanya bekerja dengan baik, tetapi ada satu masalah yang saya belum mengerti. Salah satu situs kami menjalankan WordPress, yang membawa daftar aturan penulisan ulang yang baik dalam file .htaccess-nya. Dan tampaknya itu tidak bekerja dengan baik dengan arahan ProxyPass di pengaturan vhost.

Vhost kami berisi konfigurasi berikut:

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

Ini berfungsi dalam banyak kasus.

Sekarang, file htaccess tidak, antara lain, ini:

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]

Karena situs ini adalah multiblog dalam subdirektori, saya membaca bahwa URL /blogname/wp-admin/load-styles.php?xxxx harus ditulis ulang sebagai wp-admin / load-styles.php? Xxx (aturan penulisan ulang kedua). Tetapi melihat pada mod_proxy log, permintaan yang dikirimkan sebenarnya adalah /blogname/wp-admin/load-styles.php.

Saya membaca ini karena ada masalah yang diutamakan - aturan ProxyPass menyala sebelum semua RewriteRules diselesaikan.

Saya terhalang - apa yang bisa menjadi penyebabnya?

Konrad Neuwirth
sumber
Sudahkah Anda mencoba meletakkan penulisan ulang di vhost daripada di .htaccess? (Pastikan Anda merawat tebasan utama jika Anda melakukannya.)
Ladadadada
Ini hanya bisa menjadi solusi sementara: Perangkat lunak yang menulis aturan penulisan ulang adalah WordPress itu sendiri. Ini digunakan untuk memperbarui aturan sesekali (dan baik itu dalam proses pembaruan), jadi saya tidak bisa menyembunyikannya sepenuhnya dari ruang web.
Konrad Neuwirth
@KonradNeuwirth Apakah itu bekerja dengan baik ketika Anda beralih ke proxy melalui RewriteRuledengan [P]bendera, di bawah aturan lain?
Shane Madden

Jawaban:

12

Saya menemukan solusi ini, saya tidak tahu apakah itu cara terbaik, tetapi bekerja untuk saya.

  1. Hapus garis:

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1
    
  2. Tambahkan ini dalam arahan Anda:

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

    Semua file php asli akan dialihkan ke proxy fcgi.

    Dan " RewriteOptions InheritBefore " Ini memaksa konfigurasi saat ini untuk mewarisi konfigurasi induk, tetapi diterapkan sebelum aturan yang ditentukan dalam lingkup anak (.htaccess di direktori). Apakah satu-satunya cara yang saya temukan memiliki kompatibilitas antara konfigurasi fcgi dan klien .htaccess config.

  3. Untuk mengontrol parameter lain yang Anda perlukan untuk proxy:

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

Dengan ProxyPassMatch, .htaccessfile diabaikan. Coba gunakan FilesMatchdan SetHandlersebagai gantinya, seperti dijelaskan di sini dan di sini .

Peter Nowee
sumber
Tolong jangan posting jawaban yang sama persis beberapa kali. Sebagai gantinya, bila berlaku, pilih / panji pertanyaan sebagai duplikat.
Sven
Ini yang saya cari. Itu memungkinkan untuk menggunakan mod_rewrite dalam konteks htaccess.
David
0

Pindahkan logika penulisan ulang ke dalam ekspresi ProxyPassMatch. Tambahkan dua baris ProxyPassMatch tambahan sebelum yang ada di konfigurasi vhost Anda sebagai berikut:

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
sumber