2013-04-20 28 views
1

這是一個簡單的HTML文件上傳表單。在POST請求完成之前,PHP(帶有Apache或Nginx)是否可以檢查HTTP標頭?

<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(); 

正如您所見,PHP腳本在服務器端不做任何事情。但是當我們上傳一個大文件時,這個過程仍然需要很長時間。

我知道,我的PHP代碼將在POST過程結束後執行。 PHP MUST在第一行代碼解析之前準備名爲$ _POST和$ _FILES的數組。

所以我的問題是:在POST請求完成之前,PHP(帶有Apache或Nginx)是否可以檢查HTTP頭?

例如,一些PHP擴展或Apache模塊。

有人告訴我,Python或node.js可以解決這個問題,只是想知道PHP是否可以。

謝謝。

================更新1 ================

我的目標是試圖阻止一些意想不到的文件上傳請求。例如,我們生成了一個唯一的標記作爲POST目標url(如http://some.com/upload.php?token=268dfd235ca2d64abd4cee42d61bde48&t=1366552126)。在服務器端,我的代碼是這樣的:

<?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 
/* ... */ 

代碼看起來很有意義:-P但不能像預期的那樣節省帶寬。原因是PHP代碼運行得太晚,我們無法在文件上傳完成前檢查令牌。如果有人在URL中上傳沒有正確標記的文件,我的服務器的網絡和CPU仍然浪費。

任何建議是值得歡迎的。非常感謝。

+0

我要問的問題是,你爲什麼想要得到的頭?原因是可能有更好的方法來實現你想要達到的目標。 – 2013-04-20 12:41:02

+0

@OkekeEmmanuelOluchukwu感謝您的幫助,請參閱我的更新內容。 – Alix 2013-04-21 14:00:29

+0

當你說'大'檔案時,你的意思是'大'?說1Gb,100Mb只是給一個範圍,它也一直是大文件? – 2013-04-22 09:41:16

回答

1

答案總是肯定的,因爲這是開放源代碼。但首先,一些背景:(我只會談論nginx,但Apache幾乎是一樣的)。

上傳請求不會立即發送到您的PHP後端 - nginx緩存上傳主體你的PHP應用程序不佔用100MB的RAM,等待一些人通過300波特調制解調器上傳。缺點是你的應用程序甚至沒有發現上傳,直到它完成或大部分完成上傳(取決於client_body_buffer_size)。

但是你可以編寫一個模塊將內部的不同「階段」掛鉤到nginx。其中一個掛鉤在標頭完成時被調用。你可以在LUA中編寫模塊,但它相當複雜。可能有一個模塊會通過HTTP將「預上載」鉤子發送到您的腳本。但是這對於性能並不好。

這很可能你甚至不需要一個模塊。 nginx.conf文件可以做你需要的。 (例如,根據標題將請求路由到不同的腳本,或者根據標題返回不同的錯誤代碼。)請參閱此頁查看標題檢查的示例(尤其是「使用磁盤(增強)的WordPress w/W3 Total Cache」):http://kbeezie.com/nginx-configuration-examples/

閱讀文檔,因爲一些常見的頭文件檢查需要已經有自己的指令(即如果Content-Length頭太大,client_max_body_size將拒絕請求。)

+0

對不起,但我怕你誤解我的問題。 – Alix 2013-05-03 03:15:13

相關問題