2

みなさん、おはよう

基本的に、プロキシ サーバーに関連する問題が原因で、Windows 7 開発用 PC から内部および外部サーバーへの cURL 要求を正常に行うことができません。Apache 2.4 で cURL 7.21.2 から PHP 5.3.6 を実行しています。

失敗する最も基本的なリクエストは次のとおりです。

<?php

$curl = curl_init('http://www.google.com');

$log_file = fopen(sys_get_temp_dir() . 'curl.log', 'w');

curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_VERBOSE => TRUE,
    CURLOPT_HEADER => TRUE,
    CURLOPT_STDERR => $log_file,
));

$response = curl_exec($curl);

@fclose($log_file);

print "<pre>{$response}";

次の (完全な) 応答が受信されます。

HTTP/1.1 400 Bad Request
Date: Thu, 06 Sep 2012 17:12:58 GMT
Content-Length: 171
Content-Type: text/html
Server: IronPort httpd/1.1

Error response

Error code 400.

Message: Bad Request.

Reason: None.

cURL によって生成されるログ ファイルには、次の内容が含まれます。

* About to connect() to proxy usushproxy01.unistudios.com port 7070 (#0)
*   Trying 216.178.96.20... * connected
* Connected to usushproxy01.unistudios.com (216.178.96.20) port 7070 (#0)
> GET http://www.google.com HTTP/1.1
Host: www.google.com
Accept: */*
Proxy-Connection: Keep-Alive

< HTTP/1.1 400 Bad Request
< Date: Thu, 06 Sep 2012 17:12:58 GMT
< Content-Length: 171
< Content-Type: text/html
< Server: IronPort httpd/1.1
< 
* Connection #0 to host usushproxy01.unistudios.com left intact

次のように、プロキシとユーザーの資格情報を明示的に指定しても違いはありません。応答は常に同じです。

<?php

$curl = curl_init('http://www.google.com');

$log_file = fopen(sys_get_temp_dir() . 'curl.log', 'w');

curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_VERBOSE => TRUE,
    CURLOPT_HEADER => TRUE,
    CURLOPT_STDERR => $log_file,
    CURLOPT_PROXY => 'http://usushproxy01.unistudios.com:7070',
    CURLOPT_PROXYUSERPWD => '<username>:<password>',
));

$response = curl_exec($curl);

@fclose($log_file);

print "<pre>{$response}";

リクエスト行 ('GET ...') に絶対 URL が表示されているのには驚きましたが、HTTP 仕様によると、プロキシ サーバーを扱う場合は問題ないと思います。

私はあらゆる種類のオプションの組み合わせを試しました-ユーザーエージェントの送信、あれこれのフォローなど-スタックオーバーフローの質問や他のサイトを調べましたが、すべてのリクエストは同じ応答で終了します。

コマンドラインでスクリプトを実行しても同じ問題が発生するので、Apache の問題ではないでしょうか。

同じネットワーク上のLinuxボックスから cURL を使用してリクエストを行った場合、問題は発生しません。

私を困惑させているのは「Bad Request」です。私の要求のどこが間違っているのでしょうか? なぜ私がこの問題を経験しているのか分かりますか? Windowsのもの?使用している PHP/cURL のバージョンにバグがありますか?

どんな助けも非常に感謝して受け取りました。どうもありがとう。

4

1 に答える 1

0

cURL (Windows と Linux の異なるバージョン) と IronPort のバージョンの間に問題がある可能性があります。IronPort のドキュメント:

修正済み: Web プロキシが Connection ヘッダーの代わりに Proxy-Connection ヘッダーを使用するため、一部のユーザー エージェントで問題が発生する

以前は、明示的な転送要求でユーザー エージェントと通信するときに、Web プロキシは Connection ヘッダーではなく Proxy-Connection ヘッダーを使用していました。このため、Real Player などの一部のユーザー エージェントが期待どおりに動作しませんでした。これは発生しなくなりました。これで、Web プロキシは Proxy-Connection ヘッダーに加えて Connection ヘッダーを使用してクライアントに応答します。[不具合ID:46515]

ヘッダーを削除Proxy-Connection(または追加Connection) してみて、問題が解決するかどうかを確認してください。

また、Windows ホストと Linux ホストの間で cURL ログを比較することもできます。

于 2012-09-06T18:21:34.327 に答える