3

基本認証を使用して(暗号化されたヘッダーを送信して)CURLリクエストを作成しようとしています。ただし、"Host: _"ヘッダーを設定しようとすると、リモートサーバーは次のように応答します。

不正なリクエスト:ブラウザがこのサーバーが理解できないリクエストを送信しました。

CURL呼び出しを行うコードは次のとおりです。変数の"Host: url"ヘッダーをコメントアウトするとすぐに機能することに注意してください。$http_headerただし、認証手順の一環として対象サーバーで使用されているため、単純に削除することはできません。

    $curl = curl_init();

    $opt = array(
        CURLOPT_URL=>$url,
        CURLOPT_RETURNTRANSFER=>1,
        CURLOPT_HTTPHEADER=>$http_header,
        CURLOPT_POST=>1,
        CURLOPT_POSTFIELDS=>$data_params,
        CURLOPT_CONNECTTIMEOUT=>5, // Timeout to 5 seconds
    );
    curl_setopt_array($curl, $opt);

    // $output contains the output string
    $output = curl_exec($curl);

    // it closes the session
    curl_close($curl);

$http_header(連想配列)の内容:

array
  0 => string 'Host: http://localhost/work/myproject'
  1 => string 'Content-Type: multipart/form-data'
  2 => string 'X-Authorization: Basicauth Z2xZjA2YzJhMzIxYTI1ZmIzZTgxYQ=='
4

4 に答える 4

3

ヘッダーはHost完全なURLを受け入れませんが、ホスト名のみを受け入れます。

この場合の解決策は、このヘッダーを置き換えることです。

"Host: $url"

と:

"Host: ". parse_url($url, PHP_URL_HOST) ."
于 2013-02-20T11:57:24.127 に答える
2

ヘッダーはHost、URLではなくホスト名を取ります。つまりlocalhost、ではありませんhttp://localhost/work/myproject

ただし、 cURLはそれを自動的に生成するはずCURLOPT_URLです。

于 2013-02-20T10:55:06.937 に答える
1

ヘッダーにはHostプロトコルを含めることはできず、ホストの名前のみを含める必要があります。したがって、この場合、必要なのはlocalhost

'Host: localhost'
于 2013-02-20T10:55:04.877 に答える
1

どちらの答えも質問者の質問に答えるとは思いません。私は同じ問題に遭遇しました。cURLが送信しているものを見ると、独自のHostヘッダーを送信しています。これは、1つ追加すると、2つになることを意味します。すべてのサーバーは、複数のホストヘッダーが表示された場合、400エラーで応答する必要があります。

秘訣は、cURLを取得して独自のヘッダーを生成しないようにすることです(これはまだ方法がわかりません)。または、ヘッダーを送信しないでください。あなたの場合、あなたを送らないのは問題ないようです。しかし、私がしていることのために、私は私のものを送らなければなりません。

于 2015-08-08T15:50:17.633 に答える