2009-11-12 92 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"