1

以前は機能していたので、ホスティング会社の何かが最近変更された可能性があると思います。しかし、それらは役に立たない。

私はfile_get_contentsファイルにロードするものを使用しています..正直に言うと、それはコードパックの一部であり、それが何をするのか100%ではありません. ただし、URL はかなりの長さで、ファイルの結果を単純にエコーアウトします。

すなわち

$custom = getRealIpAddr()."|||||".$_SESSION['cart']."|||||".makeSafe($_GET['i'])."|||||".$lang;
$pphash = create_paypal_hash(makeSafe($_SESSION['cart']), '', create_password('####'), $custom);
$tosend = base64_encode(urlencode($pphash));
$cgi = "http://www.***********.com/pl/b.pl?a=".$tosend; // TEST LINE
echo file_get_contents($cgi);

これにより、約 390 文字の URL が生成されます。約 360 文字に切り詰めると問題なく動作しますが、ファイルに渡された GET データの一部が失われるため、これは解決策ではありません。

360 文字を超える URL で 403 禁止エラーがスローされる原因となっている、私のホストで何が変更された可能性があるかについてのアイデアはありますか?

curl メソッドも試しましたが、同じ結果が得られます。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $cgi);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
4

1 に答える 1

2

出典: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.1

一部の古いクライアントまたはプロキシの実装ではこれらの長さが適切にサポートされていない可能性があるため、サーバーは 255 バイトを超える URI の長さに依存することに注意する必要があります。

これは、GET を 255 より長く使用しないようにする必要があることを意味します。

お気づきのように、一部のサーバー (あなたのもの) は 255 (あなたの場合は 360) を超えません。

POST を使用します。

カールの場合:

$url = 'http://www.example.com';
$vars = 'var1=' . $var1 . '&var2=' . $var2;

$con = curl_init($url);
curl_setopt($con, CURLOPT_POST, 1);
curl_setopt($con, CURLOPT_POSTFIELDS, $vars);
curl_setopt($con, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($con, CURLOPT_HEADER, 0);
curl_setopt($con, CURLOPT_RETURNTRANSFER, 1);

$re = curl_exec($con);

カールなし:

function do_post_request($url, $data, $optional_headers = null)
{
  $params = array('http' => array(
              'method' => 'POST',
              'content' => $data
            ));
  if ($optional_headers !== null) {
    $params['http']['header'] = $optional_headers;
  }
  $ctx = stream_context_create($params);
  $fp = @fopen($url, 'rb', false, $ctx);
  if (!$fp) {
    throw new Exception("Problem with $url, $php_errormsg");
  }
  $response = @stream_get_contents($fp);
  if ($response === false) {
    throw new Exception("Problem reading data from $url, $php_errormsg");
  }
  return $response;
}
于 2013-06-18T20:18:11.900 に答える