我的 Apache/PHP 设置如下:https://wiki.apache.org/httpd/PHP-FPM
它包括ProxyPassMatch
如下规则:
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/path/to/files/$1
这会将.php
其中的所有请求发送到代理,最终为 PHP 提供服务。
但是,我一直在尝试进行一些访问控制,代理似乎优先。我的文件夹结构如下:
/ <-- PHP files
/extra/ <-- PHP files
/css/
/img/
应该可以访问根目录中的 PHP 文件,但我想限制对该extra
目录的访问。我已将以下几行添加到我的主要配置中:
<Directory "/extra">
Order deny,allow
Deny from all
</Directory>
但是 PHP 文件仍然在执行...当我将不同类型的文件放入文件夹中时,它被成功阻止,因此该指令有效。我猜规则ProxyPassMatch
禁止它对 PHP 文件起作用。
我尝试了一些方法,例如将规则放在块ProxyPassMatch
内<Directory>
(不起作用,因为你不能ProxyPassMatch
在这样的块内使用)并且ProxyPassMatch
用RewriteRule
标志替换[P]
(类似于:Apache 2.4 + PHP-FPM + ProxyPassMatch,但没有得到代理)。
我的问题几乎和这个问题完全一样:http://www.gossamer-threads.com/lists/apache/users/417758不过,并未得到明确答复。
让我困惑的是,你需要设置代理规则,但当你设置它时,其他一切都变得无关紧要了(.htaccess 也不再起作用)。此外,这引发了安全性问题。其中的所有内容.php
都不会受到我花哨的访问规定的影响,而是直接进入系统内部。我如何将 PHP-FPM 与 Apache 中的适当安全规则结合起来?
答案1
带有ProxyPassMatch
.htaccess
文件将被完全忽略。主配置文件中忽略的指令也可能会发生类似情况。
尝试使用FilesMatch
和SetHandler
代替,如中所述2015 年回答您已链接的问题, 和这篇博文。
答案2
将其放在 ProxyPassMatch 前面
ProxyPass /extra !
如果 ProxyPass 发现 /extra 是当前文件夹,则不会使用 ProxyPassMatch。重要的是行末的 !。
浏览此处获取更多信息: 代理通行证
答案3
这是一个老问题,但当我搜索使用ProxyPass
和时对 Apache 进行访问控制的解决方案时,它就在第一页ProxyPassMatch
。因此,它可能对从这里开始而不是从 Apache 的文档开始的其他人有所帮助。
解决方案是在代理声明下面包含一个部分:
<Proxy "*">
Require ip 192.168
Require host example.com
</Proxy>
这一切都按照mod_proxy 文档。