我们最近将 Apache 2.4.7 模式从 mpm_pre-fork 切换到 mpm_event。从那时起,我们就无法让我们的Files
指令正常工作了。
<Files "*.php">
Header set Cache-Control "no-cache, no-store, must-revalidate, max-age=0"
</Files>
我确实设法解决了这个错综复杂的问题:
<Files ~ "((^$)|(php))">
但是,根据我的正则表达式知识,这将匹配文件名中任何位置带有“php”的文件。我发现需要匹配“null”的情况来自另一个问题我们也尝试过,FilesMatch
结果是一样的。
从 Apache 2.4 文档中我了解到的情况来看,这一切都毫无意义。有其他人见过类似的问题吗?
更新:我将服务器恢复到 mpm_preforker 和 mod_php,没有任何变化。然后我清除了 apache 和 php,重新安装为 mpm_preforker,它又可以正常工作了。然后我升级到 mpm_event 和 php-fpm,过了一会儿它就停止工作了。我正在尝试找出问题所在,并将发布我发现的情况。
更新2:这似乎与 fastcgi 或 php-fpm 有关。我有两个<Files>
指令,一个用于生成唯一标头html
,另一个用于php
生成唯一标头:
<Files *.html>
Header always set X-Aaron-files "html match"
</Files>
<Files *.php>
Header always set X-Aaron-files "php match"
</Files>
如果我转到一个虚构的php
文件,那么我会收到一个带有标题的 404 消息php-match
。但是如果我转到一个真实php
文件,那么服务器会执行 php 文件,但不会返回指示php
文件匹配的标题。
答案1
<Files "*.php">
作品
尝试除标题之外的其他内容,例如重定向页面:
<Files "*.php">
redirect 301 / /anyPage.htm
</Files>
如果你想用正则表达式做同样的事情,你可以这样做
<Files ~ "\.php">
redirect 301 / /anyPage.htm
</Files>
如果您希望匹配任何 php 页面:
<Files ~ "(^$|\.php)">
redirect 301 / /anyPage.htm
</Files>
使用 filematch:
<FilesMatch "(^$|\.php)">
redirect 301 / /anyPage.htm
</FilesMatch>
您可以进行测试它是否会起作用。
我怀疑你在其他地方得到了一些指令,这些指令覆盖了你的标题
答案2
这似乎与 fastcgi 和 php-fpm 有关。
不确定它是如何通过测试的……
如果请求的文件是由 php-fpm 处理,然后是指令不是处理。
如果文件不是由 php-fpm 处理(包括缺少 php 文件的 404 响应),然后是指令是处理。