Hiểu về apache 2.4 mod_proxy_fcgi và RewriteRules trong htaccess


9

Gần đây chúng tôi đã chuyển một trong các máy chủ web của chúng tôi sang apache 2.4 và chạy PHP thông qua php-fpm và mod_proxy_fcgi. Hầu hết mọi thứ hoạt động khá tốt, nhưng có một vấn đề mà tôi chưa hiểu. Một trong những trang web của chúng tôi đang chạy WordPress, nơi cung cấp một danh sách tốt các quy tắc viết lại trong tệp .htaccess của nó. Và dường như những thứ đó không hoạt động tốt với chỉ thị ProxyPass trong thiết lập vhost.

Vhost của chúng tôi chứa cấu hình sau:

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

Điều này hoạt động trong hầu hết các trường hợp.

Bây giờ, tập tin htaccess thực hiện, trong số những thứ khác, điều này:

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]

Vì trang web là một multiblog trong các thư mục con, tôi đọc rằng URL /blogname/wp-admin/load-styles.php?xxxx nên được viết lại dưới dạng wp-admin / load-style.php? Xxx (quy tắc viết lại thứ hai). Nhưng nhìn vào nhật ký mod_proxy, yêu cầu được chuyển thực sự là /blogname/wp-admin/load-styles.php.

Tôi đọc điều này vì có một vấn đề ưu tiên - quy tắc ProxyPass kích hoạt trước khi tất cả các RewriteRules đã được xử lý.

Tôi bị cản trở - điều gì có thể là nguyên nhân?


Bạn đã thử đặt các bản ghi lại trong vhost chứ không phải trong .htaccess chưa? (Hãy chắc chắn rằng bạn sẽ chăm sóc
vết

Đây chỉ có thể là một giải pháp ngăn chặn: Phần mềm viết các quy tắc viết lại là chính WordPress. Nó được sử dụng để cập nhật các quy tắc một lần trong một thời gian (và là trong quá trình cập nhật), vì vậy tôi hoàn toàn không thể ẩn chúng khỏi không gian web.
Konrad Neuwirth

@KonradNeuwirth Nó có hoạt động đúng khi bạn chuyển sang ủy quyền qua a RewriteRulevới [P]cờ, bên dưới các quy tắc khác không?
Shane Madden

Câu trả lời:


12

Tôi tìm thấy giải pháp này, tôi không biết nếu đó là cách tốt nhất, nhưng hiệu quả với tôi.

  1. Xóa dòng:

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1
    
  2. Thêm điều này trong chỉ thị của bạn:

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

    Tất cả các tệp php thực sẽ chuyển hướng đến proxy fcgi.

    Và " RewriteOptions thừa kế trước" Điều này buộc cấu hình hiện tại kế thừa cấu hình của cha mẹ, nhưng được áp dụng trước các quy tắc được chỉ định trong phạm vi con (.htaccess tại thư mục). Là cách duy nhất tôi thấy có khả năng tương thích giữa cấu hình fcgi và cấu hình máy khách .htaccess.

  3. Để kiểm soát các tham số khác, bạn có thể cần proxy:

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

2

Với ProxyPassMatch, .htaccesscác tập tin được bỏ qua. Hãy thử sử dụng FilesMatchSetHandlerthay vào đó, như được mô tả ở đâyở đây .


Xin vui lòng không đăng cùng một câu trả lời chính xác nhiều lần. Thay vào đó, khi áp dụng, bỏ phiếu / gắn cờ các câu hỏi là trùng lặp.
Sven

Đây là những gì tôi đang tìm kiếm. Nó cho phép sử dụng mod_rewrite trong bối cảnh htaccess.
David

0

Di chuyển logic ghi lại vào các biểu thức ProxyPassMatch. Thêm hai dòng ProxyPassMatch bổ sung trước dòng trong cấu hình vhost của bạn như sau:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.