了解htaccess中的Apache 2.4 mod_proxy_fcgi和RewriteRules


9

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

我们的虚拟主机包含以下配置:

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

在大多数情况下,这是可行的。

现在,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]

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

我读此书是因为存在优先级问题– ProxyPass规则在所有RewriteRules处理完毕之前就触发了。

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


您是否尝试过将重写内容放入虚拟主机而不是.htaccess中?(如果需要,请确保您注意斜杠的
开头

这可能只是权宜之计:编写重写规则的软件是WordPress本身。它用于偶尔更新规则(并在更新过程中进行更新),因此我无法将其完全隐藏在网络空间之外。
Konrad Neuwirth 2012年

@KonradNeuwirth在通过其他规则下方的RewriteRule带有[P]标志的a切换为代理时,它是否可以正常工作?
Shane Madden

Answers:


12

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

  1. 删除行:

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1
    
  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>
    

    所有真实的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>
    

2

使用ProxyPassMatch.htaccess文件将被忽略。如此此处所述,尝试使用FilesMatchSetHandler代替。


请不要多次发布完全相同的答案。相反,在适用时,将问题投票/标记为重复。
斯文

这就是我想要的。它允许在htaccess上下文中使用mod_rewrite。
David

0

将重写逻辑移到ProxyPassMatch表达式中。在vhost配置中的第一行之前添加两行其他ProxyPassMatch行,如下所示:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.