0

奇妙な問題です。fsockopen()ページへの接続を開いています。そのページheader(location:xx)には同じページへのリンクがあります (スクリプトを更新しただけです)が、リダイレクトが機能していないようです...

ブラウザで複製している場合、明らかにすべてが機能しています...

いくつかのコード:

接続ページ:

$socketcon = fsockopen($_SERVER['HTTP_HOST'],80,$errorno,$errorstr,10);
if($socketcon) {
    $socketdata = "GET http://www.example.com/test2.php HTTP/1.0\r\nHost: ".$_SERVER['HTTP_HOST']."\r\nConnection: Close\r\n\r\n";
    fwrite($socketcon,$socketdata); 
    fclose($socketcon);
}

接続ページ (test2.php):

<?
//other code (working fine)

if($_GET["AAA"]){

     //REDIRECT WORKED !

} else {
     header("location:test2.php?AAA=1");   //same page but with a get param
}
?>

REDIRECT WORKED 部分は決して実行されません...

助言がありますか ?

編集: 接続は非同期でなければなりません

4

3 に答える 3

2

助言がありますか ?

はい、ソケットを使用してcURLがより適切に実行できることを行うのはやめてください ;) Aheader('Location: X')は実際に 301/303 HTTP 応答を送信しますが、これはユーザー (またはブラウザー) が新しい要求を作成して処理する必要があります。ただし、リダイレクトを処理していないようです。一方、cURL はブラウザのような機能を模倣し、次の方法でリダイレクトを追跡できます。curl_setopt( $curlResource, CURLOPT_FOLLOWLOCATION, true );

于 2012-05-23T08:52:40.110 に答える
1

PHPで非同期 HTTP リクエストを作成することは可能ですか? これは同様の質問です。

exec()戻り値が必要ない場合は、-family 関数を使用することをお勧めします。curl を追加して呼び出すだけ&で、バックグラウンドで実行されます。

本当に、本当に PHP でこれを行いたい場合は、次のいずれかを行うことができます: 新しいプロセスを生成する (を使用pcntl_fork()) か、自分でリダイレクトを処理します。

リダイレクトを処理するには、次のことが必要です。

  1. ストリームから読み取られた最初の 3 文字を見て、応答コードが何であるかを判断します。200 は成功を意味し、300 の数字は部分的な成功を意味します。
  2. 最初の 3 文字に 302 (または 307) が見つかったら、ロケーション ヘッダーを検索します。これは regex と一致する/\s*location:\s*(.+)$/mと思います。
  3. 場所フィールドから取得した URL が期待どおりであり、信頼できることを確認します。これは絶対 URL である必要がありますが、安全なサーバー、安全なポート、安全な URL、および安全なパラメーターを確認する必要があります。parse_url()便利な場合がありますが、潜在的なセキュリティの問題をチェックしません
  4. 上記で一致した新しい URL への新しい接続を開きます (または、同じホストであり、Keep-Alive で HTTP 1.1 を使用している場合は、接続を再利用します) 適切なデータを送信します。
  5. 必要に応じて結果/クリーンアップを処理します。

これは非常に複雑であることがわかります。これも再帰的になります。あなたが実際に話していることは、PHP で初歩的な HTTP パーサーを作成することです。これは良い考えではありません。cURL を使用して、非同期にする別の方法を見つけてください。

于 2012-08-08T14:45:56.330 に答える
0

接続関数はリダイレクトを処理しません。

それをサポートしたい場合は、自分でコードを書くかcurl、接続を確立するためのようなライブラリを使用する必要があります。

于 2012-05-23T08:47:04.353 に答える