我有一个简单的上传表单,这里是开始和结束标记:
<form action="post.php" method="post" enctype="multipart/form-data">
</form>
我在提交时收到500内部服务器错误。 apache日志显示以下条目(主机名和ip编辑):
[Tue Feb 14 00:08:32 2012] [error] [client xxx.xxx.xxx.xxx] ModSecurity: Input filter: Failed to create temporary file: /root/tmp/20120214-000832-TznsTkPj2kkAAE5LYREAAAAB-request_body-xqZDkt [hostname "xxxxxxxxxx.com"] [uri "/app/221/product/post.php"] [unique_id "TznsTkPj2kkAAE5LYREAAAAB"]
[Tue Feb 14 00:08:37 2012] [error] [client xxx.xxx.xxx.xxx] ModSecurity: Input filter: Failed to delete temporary file: /root/tmp/20120214-000832-TznsTkPj2kkAAE5LYREAAAAB-request_body-xqZDkt [hostname "xxxxxxxxxx.com"] [uri "/app/221/product/post.php"] [unique_id "TznsTkPj2kkAAE5LYREAAAAB"]
我搜索了代码,在任何地方都没有提到root
或upload_tmp_dir
。所有代码文件都属于应用程序用户和组。在php.ini
中,upload_tmp_dir
最初没有设置,我现在将其设置为/tmp
,但这也没有解决问题。
知道它为什么要上传到/root/tmp
?
答案 0 :(得分:3)
看起来您应该检查ModSecurity settings,特别是 SecUploadDir 设置。
文件上传支持
ModSecurity能够拦截通过POST上传的文件 请求和multipart / form-data编码或(截至1.9)通过PUT 请求。
由于只有一个地方可以在PHP中设置该值,并且已经在运行时验证过,而且我们知道您从日志输出中运行了ModSecurity,看起来很可能就是这样。
每个OP的注释:
如果未设置SecUploadDir参数,则ModSecurity不会 忽略它。所以我们做了以下更改:SecUploadDir / tmp SecTmpDir / tmp现在完美无缺。
我偶然发现你可以在这样的情况下尝试完全禁用mod安全性以查看是否可以消除问题。然后,您可以快速将问题缩小到mod安全性:
https://serverfault.com/questions/57210/disable-modsecurity-for-a-specific-directory