如何在将PHP文件传递给PHP-FPM之前检查Apache文件是否存在?

时间:2014-12-10 18:30:25

标签: apache php

我收到以下错误"未指定输入文件。"而不是在我请求不存在的PHP文件时找不到的文件。

因此,在将PHP文件传递给PHP-FPM服务器之前,可以让Apache检查PHP文件是否存在,以避免"没有指定输入文件。"错误?或者该错误是正常的/无害的?

这是Apache配置为处理PHP文件的方式:

<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php5-fpm.sock.example|fcgi://localhost"
</FilesMatch>

3 个答案:

答案 0 :(得分:5)

我不喜欢使用RewriteEngine执行该任务。以下是使用SetHandler指令的正确配置,同时检查PHP文件是否确实存在:

<FilesMatch "\.(php|php[57]|phtml)$">
    <If "-f %{REQUEST_FILENAME}">
            SetHandler "proxy:fcgi://127.0.0.1:9000"
    </If>
</FilesMatch>

来源:https://wiki.apache.org/httpd/PHP-FPM

答案 1 :(得分:0)

这是一个mod_rewrite(虚拟主机上下文)替代配方,只有在文件存在时才设置处理程序。

RewriteEngine ON
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} -f
RewriteRule \.php$ - [H=proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost/]

但它不适用于PATH_INFO,因为它会检查文档根目录下的文件+路径信息

答案 2 :(得分:0)

默认情况下,所有对PHP脚本的请求(即使脚本在文件系统中不存在)都将在proxy_fcgi处理程序中传递。解决此问题的一种方法(需要Apache&gt; = 2.4.10)是将以下内容放在Apache2 vhost文件中:

# define worker
<Proxy "unix:/var/run/php5-fpm-domain.tld.sock|fcgi://domain.tld" retry=0>
    ProxySet connectiontimeout=5 timeout=30
</Proxy>

RewriteEngine On
RewriteOptions Inherit

<FilesMatch \.ph(p[3457]?|t|tml)$>
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .* - [H=proxy:fcgi://domain.tld,NC]
</FilesMatch>

这里,我们只在文件存在时才设置 proxy_fcgi 处理程序。 PATH_INFO 也已正确处理。请注意,我们必须继承重写规则(存储在.htaccess文件中的重写规则的情况)。