这是我的vhost文件:
<VirtualHost *:80>
ServerName awesome.dev
## Vhost docroot
DocumentRoot "/var/www/awesome"
## Directories, there should at least be a declaration for /var/www/awesome
<Directory "/var/www/awesome">
Options Indexes FollowSymLinks MultiViews
DirectoryIndex index.php
AllowOverride All
Require all granted
</Directory>
## Logging
ErrorLog "/var/log/apache2/w0JhArMoDehc_error.log"
ServerSignature Off
CustomLog "/var/log/apache2/w0JhArMoDehc_access.log" combined
## Server aliases
ServerAlias www.awesome.dev
## SetEnv/SetEnvIf for environment variables
SetEnv APP_ENV dev
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/awesome/$1
</VirtualHost>
我试图捕获对不存在的* .php文件的所有请求。
例如,如果/var/www/awesome/index.php
存在且我转到http://foo.com/index.php,我会得到正确的回复,但如果/var/www/awesome/foo.php
不存在且我转到http://foo.com/foo.php,我就是只需得到File not found.
的回复。
由于Apache将所有内容移交给PHP-FPM,因此无法读取.htaccess
文件。
我需要捕获所有404请求并显示常见错误页面,就像您在任何网站上看到的一样。
然而,由于Apache把所有东西都交给php-fpm,它似乎没有正确处理这些错误。
答案 0 :(得分:2)
我曾经有同样的问题,最后我修好了。
尝试在ProxyPassMatch设置后添加:
ProxyErrorOverride on
顺便说一下,别忘了你的
ErrorDocument 404 /path/to/file
设置。
答案 1 :(得分:0)
由于在apache / php-fpm过程中可能会出现很多问题,许多错误都会导致响应“文件未找到”,并且在日志中“AH01071:收到错误'主要脚本未知\ n'”:(路径中的双斜线) ,权限,......)
要跟踪它们,您可以:
Ps:注意另一个线程,人们说使用ProxyErrorOverride是“真是个坏主意”:https://serverfault.com/questions/450628/apache-2-4-php-fpm-proxypassmatch
答案 2 :(得分:0)
对于今天阅读的任何人,这里是正确答案,感谢 Tito1337 的answer。
如果您在代码的其他地方设置 404 或处理一些错误,ProxyErrorOverride
可能会给您带来问题或破坏您的应用程序,而且实现起来更复杂。
相反,您应该仅在文件存在时将请求传递给 php-fpm
。如果该文件不存在,Apache 将定向到您定义的 ErrorDocument
。您可以在 Apache 配置中围绕 PHP 处理程序添加此检查。
CentOS 8 示例:
#
# Redirect to local php-fpm (no mod_php in default configuration)
#
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
# Enable http authorization headers
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
<FilesMatch \.(php|phar)$>
# NEW ADDITION - CHECK IF FILE EXISTS FIRST
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
</If>
</FilesMatch>
</IfModule>
</IfModule>