Завиток: * Нарушить RFC 2616 / 10.3.2 и переключиться с POST на GET - PullRequest
3 голосов
/ 16 ноября 2011

Я использую curl для публикации в скрипте.

curl_setopt ($ch, CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);

Но существует перенаправление 301, которое заставляет curl переключаться с POST на GET.

HTTP/1.1 301 Moved Permanently
< Location: https://myserver.org/php/callback-f.php
< Content-Length: 0
< Date: Wed, 16 Nov 2011 17:21:06 GMT
< Server: lighttpd/1.4.28
* Connection #0 to host myserver.org left intact
* Issue another request to this URL: 'https://myserver.org/php/callback-f.php'
* Violate RFC 2616/10.3.2 and switch from POST to GET
* About to connect() to myserver.org port 443

Кто-нибудь знает, как я могу предотвратить переход curl на GET, пожалуйста?

Ответы [ 3 ]

5 голосов
/ 16 ноября 2011

CURLOPT_POSTREDIR может быть установлено для настройки этого поведения (метод запроса для 301 автоматического перенаправления на основе заголовка местоположения в curl):

curl_setopt (, CURLOPT_POSTREDIR, 3);

здесь 3 говорит модулю curl перенаправлять как 301, так и 302 запроса.

0,1,2,3 - допустимые параметры для последнего аргумента.

0 -> не устанавливать никакого поведения
1 -> следовать перенаправлению с тем же типом запроса только для 301 переадресации.
2 -> следовать перенаправлению с тем же типом запроса только для 302redirects.
3 -> последуют за перенаправлением с тем же типом запроса и для переадресаций 301 и 302.

См. Также: Запрос # 49571 CURLOPT_POSTREDIR не реализован , в котором есть некоторые полезные комментарии, например установка пользовательского метода запроса:

curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, "POST"); 
2 голосов
/ 16 ноября 2011

С последний вариант HTTP :

Примечание. По историческим причинам пользовательские агенты МОГУТ изменить метод запроса с POST на GET для последующего запроса.Если это поведение нежелательно, вместо него можно использовать код состояния 307 (Временное перенаправление).

Я думаю, что 303 См. Другое также может быть подходящим.

0 голосов
/ 17 ноября 2011

Что ж, столкнулся с перекомпиляцией php, потому что мой curl не поддерживает POSTREDIR, и я решил решить эту проблему с помощью JQuery. Надеюсь, это поможет кому-то!

<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script>

$.post("path/path/callback.php", { "key":"value", "key2":"value2"});

</script>
</head>
hello

</html>
...