• ベストアンサー

特定の値をPOST送信で他のサーバーに渡したい

ある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];

noname#102084
noname#102084
  • PHP
  • 回答数4
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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; 参考まで。

noname#102084
質問者

お礼

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

その他の回答 (3)

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.3

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

noname#102084
質問者

お礼

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

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

PEAR::HTTP_Requestでどうでしょ? http://pear.php.net/manual/ja/package.http.http-request.php

noname#102084
質問者

お礼

回答ありがとうございます。 参考ページを読ませていただいたのですがPEARが使いたくて仕方ないですが、私の使っているサーバではPEARが実装されていないようで使えませんでした。 POSTで値を送信しながら別ページに遷移するのを全て自動でなんて追加モジュールでもいれないとムリなのでしょうか・・・

回答No.1

データを転送後、最後に出力をせず、ヘッダーでリダイレクトしたらどうですか? header("Location: {$url}");

noname#102084
質問者

お礼

早速の回答ありがとうございます。 助言を呼んで「なるほど!」とセットしてみたのですが、今度は相手先URLには飛ぶのですが値がPOST送信されていないようです。 というのも、転送先ページでは、”ok”がPOSTで送信されていれば会員ページを表示してくれますが、送信されていなければ一般向けページが表示されてしまうのです。 最後にheader("Location: {$url}");をいれると、一般向けページが表示されてしまったので、POST送信できていないようですT T

関連するQ&A

  • postしたコンテンツの取得

    いつもお世話になっております。 PHPでHTTPでPOSTされたコンテンツを受け取るサンプルとして以下のような スクリプトを作成しました。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>sample</title> </head> <body> <p><?php var_dump(file_get_contents('php://input')); ?></p> </body> </html> そしてデータの送信側のPHPスクリプトとして以下のようなものを作成しました。 <?php function post_request($url, $data, $referer='') { // Convert the data array into URL Parameters like a=b&foo=bar etc. $data = http_build_query($data); // parse the given URL $url = parse_url($url); if ($url['scheme'] != 'http') { die('Error: Only HTTP request are supported !'); } // extract host and path: $host = $url['host']; $path = $url['path']; $port = $url['port']; var_dump($url); $fp = fsockopen($host, $port, $errno, $errstr, 30); if ($fp){ // send the request headers: fputs($fp, "POST $path HTTP/1.1\r\n"); fputs($fp, "Host: $host\r\n"); if ($referer != '') fputs($fp, "Referer: $referer\r\n"); fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); fputs($fp, "Content-length: ". strlen($data) ."\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $data); $result = ''; while(!feof($fp)) { // receive the results of the request $result .= fgets($fp, 128); } } else { return array( 'status' => 'err', 'error' => "$errstr ($errno)" ); } // close the socket connection: fclose($fp); // split the result header from the content $result = explode("\r\n\r\n", $result, 2); $header = isset($result[0]) ? $result[0] : ''; $content = isset($result[1]) ? $result[1] : ''; // return as structured array: return array( 'status' => 'ok', 'header' => $header, 'content' => $content ); } $fileHandle = fopen("/home/a/text.txt", "rb"); $fileContents = stream_get_contents($fileHandle); fclose($fileHandle); var_dump(post_request('http://ipaddress/rawpost.php',$fileContents)); ?> 上記PHPスクリプトによってPOSTされた結果のHTMLの var_dump(file_get_contents('php://input')) の部分はstring(0)となりました。 HTTPのPOSTのコンテンツ部分を取得するには どのようなスクリプトを記載すればよいのでしょうか。 どなたかご教授よろしくお願いいたします。

    • 締切済み
    • PHP
  • fsockopen で allabout のサイトだけ読めない?

    PHP4 を使っているのですが、get_heaers() 関数が搭載されていないので、fsockopen を使って自作しています。下記のような感じになっています。(かなり抜粋) $parts = parse_url($url); $fp = fsockopen($parts["host"], $parts["port"], $errno, $errstr); fputs($fp, $request."\n"); $response = fgets($fp, 1024); fclose($fp); 先日まではこのコードで問題なく動作していたのですが、今日になったら http://allabout.co.jp/ 等 allabout のサイトだけが読み込めなくなってしまいました。fgets がタイムアウトしてしまいます。 ブラウザでアクセスすると問題なく表示されますし、 telnet allabout.co.jp 80 で手動でアクセスしても問題はないようです。 PHPのfgetsが(freadも)タイムアウトしてしまうのですが、どのあたりに問題があるのでしょうか。

    • ベストアンサー
    • PHP
  • php fsockopenの文字化けについて

    PHPプログラミングの初心者です。 現在Yahooファイナンスのページから為替情報を自動で取得するスクリプトを作成しています。 サーバーからの応答は「HTTP/1.1 200 OK」となっているのですが、取得したデータが全て文字化けして表示されます。 mb_convert_encodingを使っても結果は同じでした。 どのようにすれば文字化けを解消できるのでしょうか? 下記がスクリプトの内容です。よろしくお願いいたします。 <?php /* リクエストライン */ $request = "GET / HTTP/1.0\r\n"; $request .= "Accept: */*\r\n"; $request .= "Accept-Language: ja\r\n"; $request .= "User-Agent: PHP-".phpversion()."\r\n"; $request .= "Accept-Encoding: gzip, deflate\r\n"; $request .= "Host: finance.yahoo.co.jp\r\n"; $request .= "Connection: Keep-Alive\r\n"; $request .= "\r\n"; $fp==""; $fp =@fsockopen("finance.yahoo.co.jp", 80); /* 要求データ送信 */ fputs($fp, $request); /* 応答データ受信 */ $response = ""; while (!feof($fp)) { $response.= fgets($fp); } /* 接続を終了 */ fclose($fp); /* ヘッダ部分とボディ部分を分離 */ $DATA = split("\r\n\r\n", $response, 2); /* リクエストヘッダをコメントアウトして出力 */ echo "<!--\n".$request."\n-->\n"; /* レスポンスヘッダをコメントアウトして出力 */ echo "<!--\n".$DATA[0]."\n-->\n"; /* メッセージボディを出力 */ echo $DATA[1]; ?>

    • ベストアンサー
    • PHP
  • php fputs について

    こんにちは、趣味でプログラミングをしている者です。 さっそくですが質問させていただきます。 php で何かを作ったことはないのですが すこし勉強してみようと思い、 インターネットでphpの記事を見たりしていたところ、 次のような例文を見つけました。 <?php $http_response = ''; $fp = fsockopen('www.php.net', 80); fputs($fp, "GET / HTTP/1.1\r\n"); fputs($fp, "Host: www.php.net\r\n\r\n"); while (!feof($fp)) { $http_response .= fgets($fp, 128); } fclose($fp); echo nl2br(htmlentities($http_response)); ?> この例文の処理はなんとなくわかるのですが、 上記の例文で、fputs について調べようと思い以下のサイトの 記事を見ました http://www.php.net/manual/ja/function.fputs.php そこには次のように書かれていました。 fputs fwrite() のエイリアス そこで質問させていただきたいのですが、 エイリアスとはどのようなものなのでしょうか? windows のエクスプローラでいえばショートカットのような ものでしょうか? 例文で fwrite を使ってもよいのでしょうか? ご存知のかた、教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 他のサーバーへGETし、POSTの値を得たいです。

    みなさま、こんにちは。 この質問をみて頂いた方ありがとうございます。 例えば、自分のサーバーから、別サーバーへ http://****.com/?a=1&b=2&c=3 などとGETで値を送信すると、その別サーバーからあるPOSTの値を 返してくれて、それを取得したいと考えています。 但しその別のサーバーは、自分のサーバーからしかGETの受付と POSTの送信をしないようにIPで制限しているとすると 自分のサーバーからURLを送信したようにしたいのです。 (前提として自分のサーバーのIPは伝えていて設定OKとして) ブラウザで見た人のIPではなく、自分のサーバーが送信したんだよ~ という風にして、うまいことPOSTされた値を取得したいです。 PHPでしたら、fopen などでいけると思ったのですが うまくPOSTされた値が取得できずに困っています。 自分でも調べてみたのですが、 pearのRequest.php、fsockopen でできそうと言うことを 知っただけでどうすれば良い物かと行き詰ってしまいました。 どなたか、そういった経験などある方いらっしゃいましたら ぜひぜひ、ご教示頂きたく、宜しくお願い致します。m(_ _;)m

    • ベストアンサー
    • PHP
  • PHPでトラックバック送信しようとしているのですが・・

    下のような関数を作ってトラックバックを送信する機能を実装しようとしていますが、全く上手くいきません・・。$targeturlなどの引数の値は別のPHPスクリプトから取得しています。 やっかいなのは、このプログラムを実行してもエラーが出ないことです。そのため、どこが問題なのか全く分かりません。最後の変数$resの中身も空っぽです。さっぱりわかりません・・。どうか助けてください・・。 function sendTBPing($targeturl, $topicid, $title, $excerpt){   $port = 80;   $query = "";   // POSTするデータの作成   $post = "title=".urlencode(mb_convert_encoding($title,   "UTF-8"));   $post = $post."&url=".urlencode("http://users.mswave.com/~tsugio/blog/archives.php?topicid=". $topicid);   $post = $post."&excerpt=".urlencode(mb_convert_encoding($excerpt, "UTF-8"));   $post = $post."&blog_name=".urlencode(mb_convert_encoding('sample', "UTF-8"));      // ping先URLからホスト名やパスを取り出す   $pingurl = parse_url($targeturl);   if(isset($pingurl['query'])){ $query = "?".$pingurl['query'];   }   if(isset($pingurl['port'])){ $port = $pingurl['port'];   }   // HTTPリクエストの作成   $req = "POST".$pingurl['path'].$query."HTTP/1.1\r\n";   $req = $req."Host: ".$pingurl['host']."\r\n";   $req = $req."User-Agent: PHP/".phpversion()."\r\n";   $req = $req."Content-type: application/x-www-form-urlencoded\r\n";   $req = $req."Content-Length: ".strlen($post)."\r\n\r\n";   $req = $req.$post."\r\n";   // ソケットを開く   $fn = fsockopen($pingurl['host'], $port);   if($fn === false){ throw new exception("トラックバックPINGに失敗しました");   }   // 送信   fputs($fn, $req);   // レスポンス受信   $res = "";   while(!feof($fn)){ $res = $res.fgets($fn);   }   fclose($fn);  // レスポンスのボディに<error>1</error>が含まれていればエラー   list($rhead, $rbody) = split("\r\n\r\n", $res, 2);   $rbody = urlencode($rbody);   if(strstr($rbody, "<error>1</error>") !== false){ throw new exception($rbody);   } }

    • ベストアンサー
    • PHP
  • PEAR HTTP_Requestでのヘッダ送信

    PEARのHTTP_Requestを使用し、 下記処理にてTEST_URL向けにPOSTとヘッダを同時に送信する処理を行いたいのですが 411 Length Requiredで返ってきてしまします。 サーバのログには Invalid URI in request Connection: Keep-Alive というログがerrorログに出ています。 そこでRFCを読んで見ると、 転送コーディングが施されていない場合は Content-Length ヘッダは送られなければならないが、 メッセージボディ中のオクテット数と 正確に一致しなければならないとの記載がありました。 ここに引っかかっているのかもと思い対策しようと思いましたが メッセージボディのlength(下記の☆部分)をどのように拾うかがわかりません。 require_once "HTTP/Request.php"; $req = &new HTTP_Request(TEST_URL,array()); $req->setURL(TEST_URL); $req->setMethod(HTTP_REQUEST_METHOD_POST); $req->addHeader('Host',"test.hogehoge.jp\r\n"); $req->addHeader('Content-Length',"-☆-\r\n"); $req->addHeader('Connection', "Keep-Alive\r\n"); $req->addHeader('User-Agent',"TEST ABCDEFG\r\n"); $req->addPostData('TEST_POST', 'testnano'); $result = $req->sendRequest(); if(PEAR::isError($result)) { echo $result->getMessage(); echo "<br />"; } else { echo $req->getResponseCode(); echo "<br />"; echo $req->getResponseBody(); echo "<br />"; } もしかして違う原因でしょうか? よろしくおねがいします。

    • 締切済み
    • PHP
  • fsockopenで下層ページの内容を取得するには

    わたくしphp歴4ヶ月のものです。 fsockopenで下層ページの内容を取得するにはどうすればよいのでしょうか。説明がうまくできないので例を書きます。 business.yahoo.co.jp/prod/store を指定するとエラーが出ます。 例1) $fp=fsockopen("business.yahoo.co.jp/prod/store", 80, $errno, $errstr, 30); if(!$fp) { echo "$errstr ($errno)<br>\n"; } else{ fputs($fp, "GET / HTTP/1.0\r\n\r\n"); while(!feof($fp)) { echo fgets ($fp,600); } fclose($fp); } business.yahoo.co.jpを指定するとエラーが出ません。 例2) $fp=fsockopen("business.yahoo.co.jp", 80, $errno, $errstr, 30); if(!$fp) { echo "$errstr ($errno)<br>\n"; } else{ fputs($fp, "GET / HTTP/1.0\r\n\r\n"); while(!feof($fp)) { echo fgets ($fp,600); } fclose($fp); } 下層ディレクトリのページはどのように指定すればよいのでしょうか。/←スラッシュに問題があるのでしょうか。 その場合のエラーの内容は下記です。 Warning: fsockopen(): php_network_getaddresses: getaddrinfo failed: Name or service not known in /home/mero/public_html/test.php on line 23 Warning: fsockopen(): unable to connect to business.yahoo.co.jp/prod/store:80 in /home/mero/public_html/test.php on line 23 No such file or directory (2) 基本的な質問でたいへん恐縮ですが、 ご指導お願いいたします!

    • ベストアンサー
    • PHP
  • fsockopenなどについて

    呼び出し元:aaaa.php 呼び出し先:https://bbbbb.jp/php/cccc.php 認証:Basic ユーザー/パス:user/pass メソッド:POST PHP:5.x という前提でfsockopenを使ってaaaa.phpからcccc.phpにPOSTでデータを投げようと考えています。 今回初めてコマンドラインからPOSTをすることになり、いろいろと模索している状況です。PEARやPECL系は入れないみたいなので、fsockopenをつかうことになりました。 aaaa.phpの中身 $POST = "postData"; $request = "POST /php/cccc.php HTTP/.0\n". "Host: https://cccc.jp\n". "Authorization: Basic".base64_encode("dddd:eeee"); "\n". $POST ."\n". "\n"; $fp = fsockopen("ssl://bbbbb.jp",443); fputs($fp,$request); $res=""; while(!feof($fp)){ $res=fgets,4096); fclose($fp); と、こんな感じです(今手書きだったので、このままだとコンパイルエラーになる可能性もありますが、それは無視とします) タイムアウトを15に設定しデバッグしても、それを過ぎてもなんのレスもない状態です。 requestの書き方がまずいんだと思うのですが、どこをどうすればいいのかわかりません。 authを入れない状態だと、resに"</body></html>"というタグが入ってきます。 受け取り側のスクリプトはPOSTで受け取ったものをログに吐き出すだけの単純なものです。 ちょっとつかみづらい内容で申し訳ありません。もし情報が足りなければ捕捉いたしますので、ご教授願います。

    • 締切済み
    • PHP
  • 別サーバにあるファイル存在チェック

    前回の続き的になりますが、サーバは、allow_url_fopen=off の環境です。 色々なサイトを調べてみて、下記コードを発見して、自分なりに修正しましたが、 とにかく重くて仕方ありません。いらないものがあるのでしょうか。 $url = 'http://'.$_SERVER["HTTP_HOST"].$_SERVER['SCRIPT_NAME']; $link_en = (str_replace("www", "www.en", 'http://'.$_SERVER["HTTP_HOST"].$_SERVER['SCRIPT_NAME'] )); function url_exists($link_en) { $arr = parse_url($link_en); $fp = fsockopen($arr['host'], 80); if ($fp == FALSE) return FALSE; $out = ''; $out .= "GET {$arr['path']} HTTP/1.1\r\n"; $out .= "Host: {$arr['host']}\r\n"; $out .= "\r\n"; fwrite($fp, $out); //HTTPコール $res = fgets($fp); //HTTPレスポンス $n = preg_match("/^(HTTP\/[0-9\.]+) ([0-9]+) (.+)/i", $res, $arr); if ($n == 0) return FALSE; $num = $arr[2]; if ($num >= 200 && $num < 400) return TRUE; //HTTP 200-399 ならOK return FALSE; } if (! url_exists($link_en)) { $url_en = "English"; } else { $url_en = '<a href="'.$link_en.'">English</a>'; }

    • ベストアンサー
    • PHP

専門家に質問してみよう