首页 > 解决方案 > PHP 无法使用在 Apache + PHP-fpm 中没有“php”扩展且没有“R”标志的重写规则

问题描述

我们目前正在尝试在 Docker 环境中通过 php-fpm 和 mod_proxy_fcgi 将我们的 Web 服务器切换到使用 PHP 运行的 apache 2.4。

我们曾经在 Apache 配置中有如下 URL 重写规则,它与之前的“mod_php”设置配合得很好:

RewriteRule ^/test$ /test.php [QSA]

但是,一旦我们切换到 Apache 2.4 + PHP-FPM 并在 Apache 配置中进行以下设置,php 将停止为该 URL (/test) 工作:

RewriteEngine On
RewriteRule ^/test$ /test.php [QSA]

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1

使用此设置,URL http:///test 会在屏幕上显示一个纯文本,显示“test.php”的内容,这意味着该页面根本没有被输入 PHP;但是,如果我将重写规则标志从“QSA”更改为“R”,PHP 开始工作,一切都很好。

当“R”不存在时,似乎“ProxyPassMatch”行在 RewriteRule 之前执行。那么如果是这样的话,有没有人可以解决这个问题?我敢肯定有很多网站使用干净的 URL,通常没有“php”扩展名,用于 PHP 页面......

提前致谢。

标签: phpapachedockermod-rewrite

解决方案


我认为这与 QSA 没有像 R 那样进行 30x HTTP 重定向这一事实有关,因此没有第二个请求(如使用 R 修饰符),因此最后没有带有 .php 的请求,因此这不是馈送到 PHP 解释器。作为一个快速的解决方案,我会考虑修改正则ProxyPassMatch表达式以添加测试和任何其他非 PHP 结束 URL,以提供给 PHP


推荐阅读