php - nginx 在文件上传时返回 403 禁止错误
问题描述
我有一个 php 网站,在 codeigniter 中,它允许用户上传文件。上传适用于大多数文件。但是对于少数文件,nginx 会抛出403 Forbidden错误。喜欢
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
</body>
</html>
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
这是上传失败的示例 .rb 文件之一
# Sample code from Programing Ruby, page 58
string = <<END_OF_STRING
The body of the string
is the input lines up to
one ending with the same
text that followed the '<<'
END_OF_STRING
如果我'<<'
从这个文件中删除,上传工作。这种过滤发生在哪里?
我看过 nginx 错误日志,里面什么都没有。我看过codeigniter日志,那里什么都没有。事实上上传请求没有到达我的Codeigniter 控制器,所以在到达那里之前必须被 nginx 阻止?
这是Javascript中的上传代码
function upload(file, params) {
var formData = new FormData();
formData.append("Filedata", file);
$.each(params, function(key, value) {
formData.append(key, value);
});
var xhr = new XMLHttpRequest();
var action = "/upload/file";
xhr.upload.onprogress = function(e){
// show progress with e.loaded, e.total
};
xhr.onerror = function(e) {
// handle error
};
xhr.open("POST", action, true);
xhr.send(formData);
}
在服务器端,我现在有简单的代码。
if( !isset($_FILES['Filedata']) || !file_exists($_FILES['Filedata']['tmp_name']) )
{
die('File not submitted.');
} else {
// Save file code is here
}
解决方案
尝试在您的 application/config/config.php 更改
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
经过
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-><';
但请注意您的应用程序的安全性
推荐阅读
- android-fragments - ViewPager中ParentFragment与Fragment的通信
- java - HTML 单元 LOGIN
- java - 为什么当我检查碰撞时对象没有绘制?
- dart - 在 Dart 中写入时如何处理用户输入
- maven - 如何使用包含 CI 内部版本号的 4 位版本字符串构建多模块 Maven 项目?
- sql-server - 每次在 sql server ssms 中首次尝试登录失败(登录超时过期)
- python - Pygame 的 3D 中的 rect.clip 函数
- vue.js - 一个组件的多个数据源
- laravel - Laravel 5.7:表单验证的自定义属性不起作用
- node.js - 用 TypeScript 覆盖 res.end