2009-11-12 110 views
0

我使用HTTP POST在Web服務器上調用cgi腳本併發送一些數據作爲參數。一些參數可以包含相當多的數據。這似乎是Web服務器的問題,因此我得到錯誤414(Request URI太長)。HTTP POST錯誤414

我的URI最終看起來是這樣的: http://somewebsite.com/cgi-bin/dosomething.py?function=doitnow&data=this是大量數據和服務器會抱怨...

有我打電話給CGI腳本的Web服務器上以不同的方式並傳遞一個長串?

謝謝。

回答

1

如果數據在URL中結束,那麼您不會將您的請求作爲POST發送。用POST,請求看起來像這樣(不完全):

POST/HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 10 

data=Hello 

但URL看上去依然像http://somewebsite.com/cgi-bin/dosomething.py

請求的來源是什麼樣的? HTML,也就是說,你正在把它放在一起。

+1

POST方法沒有什麼內在的要求所有參數數據將位於請求的主體中而不是查詢字符串中。瀏覽器將使用表單字段值來做到這一點,是的。而且你經常會發布只能在正文中使用的文件。但這不是真的,「如果URL中有數據,它不是POST請求。」 – 2009-11-12 03:15:28

+0

@Sixten:在這種情況下,這是一個安全的賭注,而且看起來我是對的。雖然,採取了點。 :) – 2009-11-12 03:19:39

0

您需要發出POST請求而不是GET請求。

0

您確定您使用的是POST嗎?看起來像一個GET請求給我。

<form method="post" action="....py"> <input type="hidden" name="function" value="doitnow"> <input type="hidden" name="data" value="data"> // dont forget the submit button </form>

1

有幾種方法可以做到這一點,依靠您可以訪問接收請求的CGI的事實。

最好的選擇是發送您的data作爲POST而不是GET。如果你出於某種原因無法做到這一點,你可以嘗試用某種壓縮方式發送你的數據並在CGI上解壓。

如果通訊發生在兩臺服務器之間,第一臺服務器可以將data保存到一個文件中,並將文件名發送到第二臺服務器,這樣CGI檢索這個文件而不是從URL中讀取數據。

你能夠適應CGI接收數據分割成塊,分割數據和標記與其他一些變量中的每個要求,如function=doitnow&data=bytes&chunk=1&total=2&id=somekeyfunction=doitnow&data=more-data&chunk=2&total=2&id=somekey

因爲我真的不使用Python太多了,我不t知道如何處理POST或GET值,如果是這種情況,下面是將POST和GET值傳遞給php腳本的包裝:

#!/bin/sh 

echo "Content-Type: text/html;" 
echo 
echo 

#POST=`dd count=$CONTENT_LENGTH bs=1 2> /dev/null` 
POST=`dd bs=1 2> /dev/null` 
php -f 'dosomething.php' -- "$POST" "$QUERY_STRING"