23

つまり、簡単に言うと、MVCWebAPIをバックエンドとして使用するAJAXアプリケーションがあります。ただし、クライアントは別のドメインから呼び出し、PHPプロキシファイルを使用してクロスドメインリクエストの問題を回避します。

ただし、PHPプロキシを使用すると、Web APIは100 ContinueHTTPヘッダーを使用して特定のリクエストに応答し、これを取り戻すリクエストは完了するまでに過度の時間がかかり(最大2分程度)、無効なものを返すこともあります。応答。

これはcURLの既知の問題のようであり、回避策は一般的に、cURLリクエストのexpect:100ヘッダーを削除するために以下の行を挿入することとして引用されています。

残念ながら、解決策は私にはわかりにくいようです:

$headers = getallheaders();
$headers_new = "";
foreach($headers as $title => $body) {
    $headers_new[] = $title.": ".$body;
}
//$headers_new[] = 'Expect:';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers_new);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:') );

このコードは機能しますが、他のすべてのヘッダーを削除します(HTTP基本認証ヘッダーを使用してAPIで認証しているため、これは機能しません)。また、既存のヘッダーにを追加しようとしたことに気付くかもしれExpect:ませんが、これも役に立ちませんでした。

既存のヘッダーを維持しながら、cURLが100の継続を期待しないようにするにはどうすればよいですか?

4

3 に答える 3

22

配列に である文字列が含まれていない限り、使用$headers_new[] = 'Expect:';は機能します。この場合、配列から削除する必要があります。削除しないと、(論理的に) 100 の継続が期待されます。$headers_new'Expect: 100-continue'

コードで使用getallheaders()していて、ヘッダーが既に含まれているかどうかを確認していないExpect: 100-continueため、おそらくこれがあなたのケースに当てはまります。

一般的な状況 (およびそれを作成したスクリプト) の概要を次に示します。

PHP Curl HTTP/1.1 100 Continue and CURLOPT_HTTPHEADER

GET request ..........................................: Continue: No
GET request with empty header ........................: Continue: No
POST request with empty header .......................: Continue: Yes
POST request with expect continue explicitly set .....: Continue: Yes
POST request with expect (set to nothing) as well ....: Continue: Yes
POST request with expect continue from earlier removed: Continue: No

コード:

<?php

$ch = curl_init('http://www.iana.org/domains/example/');

function curl_exec_continue($ch) {
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result   = curl_exec($ch);
    $continue = 0 === strpos($result, "HTTP/1.1 100 Continue\x0d\x0a\x0d\x0a");
    echo "Continue: ", $continue ? 'Yes' : 'No', "\n";

    return $result;
}

echo "GET request ..........................................: ", !curl_exec_continue($ch);

$header = array();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
echo "GET request with empty header ........................: ", !curl_exec_continue($ch);

curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('hello'));
echo "POST request with empty header .......................: ", !curl_exec_continue($ch);

$header[] = 'Expect: 100-continue';
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
echo "POST request with expect continue explicitly set .....: ", !curl_exec_continue($ch);

$header[] = 'Expect:';
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
echo "POST request with expect (set to nothing) as well ....: ", !curl_exec_continue($ch);

unset($header[0]);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
echo "POST request with expect continue from earlier removed: ", !curl_exec_continue($ch);
于 2013-03-11T16:51:10.687 に答える
1

ヘッダー 101 を削除するには、これを引き続き使用します

curl_setopt($ch, CURLOPT_HTTPHEADER,array("Expect:"));
于 2020-11-11T06:27:46.910 に答える