使用Apache和PHP-FPM时自定义404消息

9
我已经配置了Apache(Debian上的2.2.22版本),通过FastCGI处理PHP文件:

<FilesMatch ".+.php$">

SetHandler application/x-httpd-php

</FilesMatch>

Action application/x-httpd-php /fcgi-bin/php5-fpm virtual Alias

/fcgi-bin/php5-fpm /fcgi-bin-php5-fpm FastCgiExternalServer

/fcgi-bin-php5-fpm -socket /var/run/php5-fpm.sock -idle-timeout 600 -pass-header Authorization

为了在Apache中显示自定义的文件未找到(HTTP 404)页面,配置如下:

<Directory "/home/http/domain/root">

..

ErrorDocument 404 /pagenotfound.htm

..

</Directory>

对于不存在的非PHP文件的请求将回答使用自定义的404 pagenotfound.htm文件。没有问题。
但是,对于不存在的PHP文件的请求将回答使用http-status-header "HTTP/1.1 404 Not Found"和内容“File not found.”,因此不会使用我的自定义错误页面。有问题!
Apache错误日志在这种情况下显示:

[Sat Nov 21 14:03:07 2015] [error] [client xx.xxx.xx.xx] FastCGI: server "/fcgi-bin-php5-fpm" stderr: Primary script unknown

在使用PHP-FPM时,如何为不存在的PHP文件配置自定义404页面?
3个回答

7

1
很遗憾,此选项仅适用于2.3.10及更高版本,而相关系统运行的是2.2版本。 - coret
不要依照2.2文档 http://httpd.apache.org/docs/2.2//mod/mod_proxy.html#proxyerroroverride - Alan Birtles
适用于Apache 2.4。 - Arvy

4

当非存在的 .php 文件(以及所有其他不存在的文件)显示“文件未找到”而不是自定义错误页面时...

Centos 8,PHP 7.2.11 文件:/etc/httpd/conf.d/php.conf

在 SetHandler 后添加 'ProxyErrorOverride On'

<FilesMatch \.(php|phar)$>
    SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
    ProxyErrorOverride On
</FilesMatch>

不确定是否必要,但我随后执行了以下操作:

    systemctl restart httpd

你只需要运行命令"systemctl reload apache2"(不需要重启)。 - fred727

1

选项:ProxyErrorOverride

ProxyErrorOverride 可以在您可以访问服务器配置时使用。但是它不适用于 .htaccess 上下文,并且会阻止 PHP 输出所有已配置的状态码的动态响应体(默认值为 400599)。

选项:<If> 指令(Apache 2.4+)

让 Apache 在调用 PHP 之前检查文件是否存在:

<Files "*.php">
    <If "-e %{REQUEST_FILENAME}">
        # Assuming PHP-FPM over Unix socket via mod_proxy_fcgi.
        SetHandler proxy:unix:/path/to/php-fpm.sock|fcgi://
    </If>
    <Else>
        # Ensure that *.php files are never handled by the default handler.
        Redirect 404
    </Else>
</Files>

文档:<If>表达式解析器重定向

选项:mod_rewrite

可以使用mod_rewrite触发ErrorDocument

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule "\.php$" - [R=404]

注意:只有在目录.htaccess上下文中已经确定了REQUEST_FILENAME(而不是在服务器配置虚拟主机中)才能使用此方法。否则,它等同于REQUEST_URI,这可能不是一个现有的本地文件。

这对我起作用了,而且不需要访问配置文件。 - Soujirou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接