2009-11-12 2 views
0

Я использую HTTP POST для вызова скрипта cgi на веб-сервере и отправки некоторых данных в качестве аргументов. Некоторые из аргументов могут содержать довольно много данных. Это кажется проблемой для веб-сервера, и в результате я получаю ошибку 414 (Request URI too long).Ошибка HTTP POST 414

Мой URI заканчивает тем, что-то вроде этого: http://somewebsite.com/cgi-bin/dosomething.py?function=doitnow&data=this много данных и сервер собирается жаловаться ...

Есть другой способ для меня, чтобы вызвать CGI скрипт на веб-сервере и передать ему длинную строку?

Спасибо.

ответ

1

Вы не отправляете свой запрос как POST, если данные заканчиваются в URL-адресе. С 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, который требует всего параметра данные должны быть в тексте запроса вместо строки запроса. Браузер сделает это с помощью значений поля формы, да. И часто вы POST вещи, как файлы, которые будут работать только в теле. Но неправда, что «если в URL есть данные, это не запрос POST». –

+0

@Sixten: Это безопасная ставка, в данном случае, и похоже, что я был прав. Но точка взята. :) –

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=somekey, function=doitnow&data=more-data&chunk=2&total=2&id=somekey

Так как я на самом деле не использовать Python слишком много, я не» знаю, как обращаться с 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" 
Смежные вопросы