Apache 2.4,mod_proxy_fcgi不尊重.htaccess,解决需要

我使用mod_proxy_fcgi的Apache 2.4.7的目的是通过PHP传递到PHP-FPM(这将用于共享主机环境)。 htaccess对非php文件工作正常,但是一旦它碰到通过php请求代理的重写规则,htaccess将被忽略。

我知道为什么会发生。 问题是:我如何解决它?

这个问题如何强制apache处理请求到php文件作为本地文件的请求,然后通过代理?

我花了大量时间研究这个问题,并给出了“答案”作为解决scheme:

1)“使用Apacheconfiguration,而不是.htaccess”这是有效的解决scheme,但不是共享主机环境(我不打算给共享托pipe客户访问Apacheconfiguration))。

2)“不要使用.htaccess,因为它有性能/安全/其他问题”,那么共享托pipe客户将如何控制其网站上的访问/url重写? 除此之外,如果.htaccess不是一个要求,我会简单地使用nginx。

3)“把代理里面的重写规则” – 这是不正确的,它不起作用。

这种行为似乎不是一个错误,而是一个“function”,根据https://issues.apache.org/bugzilla/show_bug.cgi?id=54887

请注意,RewriteCond -U会在做实际的redirect之前检查URI是否正确,因此每一个请求都翻倍! 这可能会对性能造成严重影响,特别是在重载网站上。

我build议检查“RewriteOptions InheritBefore”,这似乎解决任何有关htaccessinheritance的问题,如下所述:

在htaccess中了解apache 2.4 mod_proxy_fcgi和RewriteRules

干杯,乔治

看来你把你所有的php执行传递给你不知道如何使用htaccess的快速cgi服务器,这就是为什么它忽略了这些文件。 如果您需要使用Apache的htaccess文件,那么您需要通过Apache(即使用mod_php)执行php脚本,而不是将执行传递给另一个不知道htaccess的服务。

你可以重新做你的重写规则,但由于这些是用户控制的,所以你不能做任何事情。

同时,从Apache 2.4.10:通过处理程序的代理服务器可以使用另一个选项。 请参阅Apache文档中的示例 : mod_proxy_fcgi示例

您也可以强制将请求作为反向代理请求处理,方法是创build合适的处理程序传递。 下面的示例configuration将使用反向代理将所有对PHP脚本的请求传递到指定的FastCGI服务器。 此function在Apache HTTP Server 2.4.10及更高版本中可用。 出于性能原因,您将需要定义一个代表相同fcgi://后端的worker。 这种forms的好处是它允许在服务器中发生URI到文件名的正常映射,并且本地文件系统结果被传递到后端。 当以这种方式configurationFastCGI时,服务器可以计算出最准确的PATH_INFO。

<Proxy "fcgi://localhost/"> ProxySet enablereuse=On </Proxy> <FilesMatch "\.php$"> SetHandler "proxy:fcgi://localhost:9000" </FilesMatch> 

这允许RewriteRules和身份validation在.htaccess文件中。 所有重写完成后,请求被传递给php-fpm。

我想这是最干净的方法,没有任何丑陋的重写在Apacheconfiguration:

 <VirtualHost IP:80> ServerName domain.tld ServerAlias www.domain.tld DocumentRoot /var/www/project/web <FilesMatch \.php$> SetHandler proxy:fcgi://127.0.0.1:9000 </FilesMatch> <Directory /var/www/project/web> AllowOverride All </Directory> </VirtualHost> 

编辑:

这个问题的真正的解决scheme是不把代理的重写规则放在php-fpm中,但要做到以下几点:

 RewriteCond %{REQUEST_URI} -U RewriteRule (.*\.php)$ fcgi://IP:PORT/$1 [P,L] 

在标签外面和标签内部。

原来的解决scheme有一个问题:如果有“RewriteEngine On”或任何“RewriteRule”相关的规则/条件,将导致Apache完全忽略主configuration文件中标记的重写规则。

以下是不完全正确的

我发现我不是在标签里面工作是错误的。

 RewriteMap and standard rewrite lookup of the user dirs goes here <Directory /PATH_TO_WWW/*> Standard directory conf goes here RewriteRule ^(.*\.php)$ fcgi://IP_OF_THE_FPM:FPM_PORT/$1 [P,L] </Directory> 

基本上这个秘密(至less对我来说)我需要把重写规则放在通过内部目录标签进行代理,这些目录标签是用于*用户的公共目录的。

所以如果我有/ var / www / $用户名的用户,目录标签应该是这样的:

TL; DR:在普通用户目录的目录标签内部使用代理rewirte规则。