Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用RewriteRule/PHP时写入Apache错误日志(404)_Php_Apache_Mod Rewrite_Url Rewriting - Fatal编程技术网

使用RewriteRule/PHP时写入Apache错误日志(404)

使用RewriteRule/PHP时写入Apache错误日志(404),php,apache,mod-rewrite,url-rewriting,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错误日志中 脚本返回404头: HTTP/1.1 404 N

使用似乎相当标准的方法:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php [L]
所有请求都转到index.php文件进行处理(除非Apache已经可以在磁盘上看到该文件)

但是如果脚本确定请求的URL不存在(404),您如何将其记录在Apache错误日志中

脚本返回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将Apache可能已经锁定的同一个文件写入到fopen/fread/fclose),由于apache将捕获此错误并将其附加到自己的错误日志中:

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

您还可以在
php.ini
中取消设置
error\u log
指令,这将导致附加到
ErrorLog

的每个php错误也发现写入php://stderr“在
上,不会写入该虚拟主机
错误日志,而是转到主Apache错误日志

但是,还有PHP函数error_log()

4表示它转到Apache(SAPI日志处理程序),而不是php
error\u log
文件


那太好了,我没有意识到如果你给stderr写信,它会出现在Apache错误日志中。。。您知道是否可以将Apache使用的格式与ErrorLogFormat相匹配吗?有没有理由不能在PHP中编写该格式?我的意思是,
ErrorLogFormat
真的多久改变一次?可能永远不会,这就是我现在所做的。。。但我认为只定义一次这种格式会很好(而不是为Apache定义一种格式,为最终使用这种格式的每个网站定义一种格式)。如果创建一个文件,
definitions.php
放在
define('APACHE\u ERRORLOG\u FORMAT','someFormatHere')
,那么可以使用php.ini指令
auto\u prepend\u file=/path/to/definitions.php
。带有常量的文件将可供所有使用PHP.ini作为定义的PHP安装使用。PHP在每个PHP文件前都有前缀。谢谢@DavidS,这是一种解决方法。。。我想我会坚持你最初的建议,只在脚本中指定格式,并假设它至少与Apache使用的格式大致相同,只是因为我想减少黑客的数量。
error_log('File does not exist: ' . XXX, 4);