理解 apache 2.4 mod_proxy_fcgi 和 htaccess 中的 RewriteRules

Kon*_*rth 10 mod-rewrite mod-proxy apache-2.4

我们最近将我们的一台 Web 服务器切换到 apache 2.4 并通过 php-fpm 和 mod_proxy_fcgi 运行 PHP。大多数一切都运行良好,但有一个我还不明白的问题。我们的一个网站正在运行 WordPress,它在其 .htaccess 文件中提供了一个很好的重写规则列表。并且似乎这些与 vhost 设置中的 ProxyPass 指令不能很好地配合使用。

我们的 vhost 包含以下配置:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下都有效。

现在,htaccess 文件执行以下操作:

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]
Run Code Online (Sandbox Code Playgroud)

由于该站点是子目录中的多博客,我读到 URL /blogname/wp-admin/load-styles.php?xxxx 应该重写为 wp-admin/load-styles.php?xxx (第二个重写规则)。但是查看mod_proxy的日志,其实传递的请求是/blogname/wp-admin/load-styles.php。

我读到这里是因为存在一个优先级问题——ProxyPass 规则在所有 RewriteRules 都被解决之前触发。

我受阻 - 可能是什么原因?

小智 12

我找到了这个解决方案,我不知道是否是最好的方法,但对我有用。

  1. 删除该行:

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在您的指令中添加以下内容:

    <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>
    
    Run Code Online (Sandbox Code Playgroud)

    所有真正的 php 文件都将重定向到 fcgi 代理。

    而“ RewriteOptions InheritBefore ”这会强制当前配置继承父级的配置,但在子范围(目录中的.htaccess)中指定的规则之前应用。是我发现 fcgi 配置和客户端 .htaccess 配置之间具有兼容性的唯一方法。

  3. 要控制代理可能需要的其他参数:

    <IfModule mod_proxy_fcgi.c>
        <Proxy fcgi://127.0.0.2:9126>
            ProxySet timeout=1800 disablereuse=on
        </Proxy>
    </IfModule>
    
    Run Code Online (Sandbox Code Playgroud)