使用RewriteRule / PHP时写入Apache ErrorLog(404)

时间:2012-08-13 09:49:01

标签: php apache mod-rewrite url-rewriting

使用看起来相当标准的东西:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php [L]

所有请求都转到index.php文件进行处理(除非Apache已经可以在磁盘上看到该文件)。

但是如果脚本确定所请求的URL不存在(404),那么如何在Apache ErrorLog中记录它?

脚本返回404标题:

HTTP/1.1 404 Not Found

但错误日志仍为空,而访问日志显示404:

192.168.2.2 - - [13/Aug/2012:10:39:35 +0100] "GET /404 HTTP/1.1" 404 32958

由于服务器托管多个网站,我希望他们都使用相同的机制来记录这些错误(而不是必须写入PHP中的第二个日志文件,或者尝试让PHP进行fopen / fread / fclose Apache可能已经锁定的同一个文件。)

2 个答案:

答案 0 :(得分:1)

您可以写入stderr,因为apache会捕获它并将其附加到自己的错误日志中:

$stderr = fopen('php://stderr', 'w'); 
fwrite($stderr, 'My error'); 
fclose($stderr);

您还可以在error_log中取消设置php.ini指令,这会导致每个PHP错误都附加到ErrorLog

答案 1 :(得分:1)

还发现在<VirtualHost>上写入“php:// stderr”不会写入虚拟主机ErrorLog,而是转到主Apache错误日志。

但是还有PHP函数error_log()。

error_log('File does not exist: ' . XXX, 4);

4表示它转到Apache(SAPI日志记录处理程序),而不是php error_log文件。

http://php.net/error_log

相关问题