Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.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
PHP(使用Apache或Nginx)可以在POST请求完成之前检查HTTP头吗?_Php_Linux_Apache_Http_File Upload - Fatal编程技术网

PHP(使用Apache或Nginx)可以在POST请求完成之前检查HTTP头吗?

PHP(使用Apache或Nginx)可以在POST请求完成之前检查HTTP头吗?,php,linux,apache,http,file-upload,Php,Linux,Apache,Http,File Upload,下面是一个简单的文件上传表单HTML <form enctype="multipart/form-data" action="upload.php" method="POST"> Send this file: <input name="userfile" type="file" /> <input type="submit" value="Send File" /> </form> 发送此文件: php文件也非常简单 <

下面是一个简单的文件上传表单HTML

<form enctype="multipart/form-data" action="upload.php" method="POST">
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

发送此文件:
php文件也非常简单

<?php
die();

答案总是肯定的,因为这是开源的。但首先是一些背景:(我只想谈谈nginx,但Apache几乎是一样的。)

上传请求不会立即发送到您的PHP后端——nginx缓冲上传主体,这样您的PHP应用程序就不会占用100MB的RAM,等待某个人通过300波特的调制解调器上传。缺点是,你的应用程序在上传完成或大部分上传完成之前(取决于
客户端\主体\缓冲区\大小
)都不会知道上传的内容

但是,您可以编写一个模块,以便在nginx内部连接到不同的“阶段”。在完成标头时调用其中一个钩子。您可以用LUA编写模块,但它相当复杂。可能有一个模块会通过HTTP将“预上传”挂钩发送到脚本。但这对性能来说并不好

很可能你甚至不需要模块。nginx.conf文件可以满足您的需要。(即,根据标头将请求路由到不同的脚本,或根据标头返回不同的错误代码。)有关标头检查的示例,请参阅本页(尤其是“WordPress w/W3使用磁盘的总缓存(增强)”):


阅读文档,因为一些常见的头检查需求已经有了自己的指令(即,如果内容长度头太大,
客户端最大体大小
将拒绝请求。)

HTTP
级别没有解决方案,但在
TCP
级别是可能的。请参见我在另一个问题中选择的答案:


我要问的问题是,为什么要获取标题?原因是可能有更好的方法来实现您想要实现的目标。@Okekeemmanuelouchukwu谢谢您的帮助,请查看我的更新内容。当您说“大”文件时,您的意思是“多大”?比如说1Gb,100Mb,只是给出一个范围,而且总是大文件吗?对不起,恐怕你误解了我的问题。
<?php
define(MY_SALT, 'mysalt');
if (!isset($_GET['t']) || !isset($_GET['token']) || abs(time()-$_GET['t'])>3600 || md5(MY_SALT.$_GET['t'])!=$_GET['token']) {//token check
    die('token incorrect or timeout');
}
//process the file uploaded
/* ... */