プロが教えるわが家の防犯対策術!

あるPHPページを自動転送ページとし、転送先に特定の値をPOST送信したいと考えています。
同じような質問があり、fsockopenを使ってすると良いようなのですが、どうしても上手くいきません。
現状、POST送信は成功しているのですが、URLが自動転送ページのままで、転送先ページのテキストのみが表示されている状態です。
どうすれば転送先ページに完全に移ってしまえるでしょうか。
ご助力下さい。


<ソース>
$url = "http://hoge.co.jp/test.php";  //転送先URL
$method = "POST";
$headers = "POST http://hoge.co.jp/test.php HTTP/1.1\r\n";  //転送先URL
$postdata = "parm=ok";

$URL = parse_url($url);
if(!isset($URL['port'])){$URL['port'] = 80;}

//リクエストヘッダ
$request = $method." ".$URL['path']." HTTP/1.0\r\n";
$request .= $headers;
$request .= "Host: ".$URL['host']."\r\n";
$request .= "User-Agent: PHP/".phpversion()."\r\n";
$request .= "Content-Type: application/x-www-form-urlencoded\r\n";
$request .= "Content-Length: ".strlen($postdata)."\r\n";
$request .= "\r\n";
$request .= $postdata;

//相手サーバへ接続
@$fp = fsockopen($URL['host'], $URL['port']);

// 接続失敗
if (!$fp) {die("ただいまメンテナンス中です。\n");}

//POSTで送信
fputs($fp, $request);
$response = "";
while (!feof($fp)) {
$response .= fgets($fp, 4096);
}
fclose($fp);

//ヘッダ部分とボディ部分を分離
$DATA = split("\r\n\r\n", $response, 2);

//出力
echo "<!--\n".$request."\n-->\n";
echo "<!--\n".$DATA[0]."\n-->\n";
echo $DATA[1];

A 回答 (4件)

#1 です。


> 最後にheader("Location: {$url}");をいれると、一般向けページが表示されてしまったので、POST送信できていないようですT T
タイムラグという事無いですか?
相手のサーバの反応の関係で遅れているという可能性はありませんか?
postした後コンマ数秒遅らせてみたらどうでしょうか?

http://jp2.php.net/usleep
usleep(500000);
header("Location: {$url}");

別解として、メタタグやJavaScriptでリダイレクトする方法も考えられます(恐らくPHPよりは遅延すると思われます)。JavaScriptで遅延させると言うことも可能ですね。
echo <<<SCRIPT
<a href="{$url}">{$url}</a>へジャンプします。ジャンプしない場合は<a href="{$url}">クリック</a>してください。
<script type="text/javascript"><!--
setTimeout("location.href='{$url}'",500);
//-->
</script>
SCRIPT;

参考まで。
    • good
    • 0
この回答へのお礼

何度もご回答いただきありがとうございます。
また、お礼が遅れましたことをお詫びさせてください。

教えていただいた内容などを含め、いろいろ試してみたのですがまだまだ未熟で実現にはいたりませんでした。
ひとまず今回は教えていただいたJavascriptを活用させていただきました。
また勉強して実現しようと思います。
ありがとうございました。

お礼日時:2007/12/17 10:07

POSTでリダイレクトしたいということでしょうか?


なら出来ないと判断して別の方法を考えた方がいいかと。
parm=okなら認証というのも脆弱ですし、そこらは変更できないものでしょうか。
POSTでリダイレクト自体は307ステータスを返せば一応はできますが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>parm=okなら認証というのも脆弱ですし、そこらは変更できないものでしょうか。
これはリンクしたい相手先サーバの設定なので変更できないのです;
こちらはリンクさせてもらう立場なので、できなければリンクをあきらめればいいのですが。。。

GETではすごく簡単に渡せるのを知っていたのですが、POSTがこんなに難しいとは思いませんでした。

お礼日時:2007/11/29 10:04

PEAR::HTTP_Requestでどうでしょ?



http://pear.php.net/manual/ja/package.http.http- …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
参考ページを読ませていただいたのですがPEARが使いたくて仕方ないですが、私の使っているサーバではPEARが実装されていないようで使えませんでした。

POSTで値を送信しながら別ページに遷移するのを全て自動でなんて追加モジュールでもいれないとムリなのでしょうか・・・

お礼日時:2007/11/28 19:12

データを転送後、最後に出力をせず、ヘッダーでリダイレクトしたらどうですか?


header("Location: {$url}");
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
助言を呼んで「なるほど!」とセットしてみたのですが、今度は相手先URLには飛ぶのですが値がPOST送信されていないようです。

というのも、転送先ページでは、”ok”がPOSTで送信されていれば会員ページを表示してくれますが、送信されていなければ一般向けページが表示されてしまうのです。
最後にheader("Location: {$url}");をいれると、一般向けページが表示されてしまったので、POST送信できていないようですT T

お礼日時:2007/11/28 16:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!