• ベストアンサー

headerで飛ばすときにURLエンコードを有効に

headerでほかのサイトに飛ばすとき、 header("Location: http://localhost/nani/success.php?tour=$_GET[tour]"); こんな感じでクエリを飛ばしているのですが、URLエンコーディングをする方法がわかりません。 ほかの変数($data)に入れるまえにurlencode($_GET[tour])として入れ替えて、 ?tour=$_GET[tour]の部分を?tour=$dataとしたのですができません。 ご存知の方いらっしゃいましたら教えていただけませんでしょうか?

  • buc6t
  • お礼率97% (33/34)
  • PHP
  • 回答数2
  • ありがとう数2

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

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

送り側と受け取り側のエンコードが違う場合はやり方は4つあります (1)送り側は受け取り側で受け取れるエンコードを事前に理解し、 送る際に仕様にあわせたデータをおくる (2)送り側で明示的にエンコード方式を受け取り側に伝えてやり 受け取り側がそれをみて判断する (3)受け取り側が、送られてきたデータのエンコードを想像して 想定と違う場合は自動的に変換してやる (4)受け取り側は、送られてくるデータのエンコードを特定のものと信じて それ以外の場合は、あきらめる。 今回の質問者さんの例ですと(4)だったので、しかたなく(1)にした ということですね。 スケーラビリティを考えれば、通常(2)を採用する場合が多いようです。 (3)は不正確な処理なので賢明とはいえません //send.php <?PHP $tour=urlencode($_GET["tour"]); $e=urlencode($_GET["e"]); if($tour){ header("Location: reach.php?tour=".$tour."&e=".$e); exit(); } ?> <html> <body> <a href="?tour=%82%A0%82%A2%82%A4&e=sjis">SJIS</a><br> <a href="?tour=%A4%A2%A4%A4%A4%A6&e=euc">EUC</a><br> <a href="?tour=%E3%81%82%E3%81%84%E3%81%86&e=utf">UTF</a><br> </body> </html> //reach.php → SHIFT JISを前提 <meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS"> <html> <body> <?PHP mb_internal_encoding("SJIS"); $tour=$_GET["tour"]; switch($_GET["e"]){ case "euc": $tour=mb_convert_encoding($tour,"SJIS","EUC"); break; case "utf": $tour=mb_convert_encoding($tour,"SJIS","UTF8"); break; case "sjis": case "": break; default: $tour=""; } print $tour; ?> </body> </html>

buc6t
質問者

お礼

回答ありがとうございます。 コードまで用意していただきありがとうございます。 コードはプリントアウトアウトして勉強させていただきました。 しっかり記憶しておきます。 読み返すたびに質問の仕方が悪かったと感じています。 私が組んだプログラムはクエリの受け手も送り手も utf-8で組んでいたので、たぶん受けて側はutf-8とわかるだろうと思っていたのですがそうではないのでしょうね。 勉強になりました。ありがとうございます。

その他の回答 (1)

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

なにがどうできないかわからないのでなんとも言えませんが・・・ 普通に飛ぶような気がしますが? <?PHP header("Location: ttp://localhost/nani/success.php?tour=".urlencode($_GET["tour"]).""); ?>

buc6t
質問者

お礼

回答ありがとうございます。 >なにがどうできないかわからないのでなんとも言えませんが・・ 関数headerのところで飛ばしたはずのクエリを読み取れなかったということです。 自己解決したのですが、utf-8だったから飛ばないと思っています。 shift_jisにしたらできました。 もしutf-8でもできるなら、できたということを教えていただきたいです。

関連するQ&A

  • header関数で遷移した際のURLエンコード

    こんにちは。 XOOPSを利用しております。 ログイン画面を表示する際にSSL化したいため、PHPのheader関数を利用してSSLページを表示させることをしております。 その場合に、ログイン後のリダイレクトするページを保存するために、「xoops_redirect="リダイレクト先URL"」という変数をURLに埋め込んでおります。 そこで解決できない問題があります。 header()使用時には、xoops_redirectの値をURLエンコードして以下のように送っております。 header(Location: https://localhost/xoops/user.php? xoops_redirect=%2Fxoops%2Fmodules%2Fcs%2Fsearch.php%3Fcid%3D1%26aid%3D1);" しかし、表示されるURLを見ると以下のようにxoops_redirectの値がURLエンコードされておりません。 https://localhost/xoops/user.php? xoops_redirect=/xoops/modules/cs/search.php?cid=1&aid=1 よって、$_GET['xoops_redirect']で値を取得すると、"/xoops/modules/cs/search.php?cid=1"という部分のみしか取得できません。 何か分かることがありましたら教えてほしいです。 別の解決方法でもぜんぜんかまいません。 よろしくお願いいたします。

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

    <?php header("Location:x.php?y=1"); exit; ?> はOKですが <?php $_GET['xx']; header("Location:x.php?y=1"); exit; ?> はだめです エラーメッセージは Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/z.php:2) in /var/www/html/z.php on line 3 $_GET['xx']や$_POST['xx']などをheaderの前に置けないと非常に困ります (上はテスト用PHPです) どうしたらいいでしょうか?

    • ベストアンサー
    • PHP
  • header関数について

    header関数について独自関数を絡ませたいのですがいい方法が 思いつかず悩んでおります。 パソコン用、携帯用サイトがあり携帯サイトのみheaderで飛ばした URLの最後にセッションを付加したいと思っております。 // 分岐により携帯であればセッションを変数作成しています。 $sis_id = '?' . session_name() . '=' . session_id(); // パソコンであれば$sis_idはnullなのでこの状態でもなにも付加されません。 header('Location: hoge.php' . $sis_id); ここまでは問題ないのですが以下のようにURLに他のパラメーターを 持っている場合どうすればいいでしょうか? header('Location: hoge.php?id=5' . $sis_id); これだと$sis_idの頭は?ではなく&が必要になりますよね。 仮に$sis_idの?を外して以下のように書き換えるという手も考えた のですがパソコンの場合hoge.php?id=5&のようなURLになってしまいます。 header('Location: hoge.php?id=5&' . $sis_id); if文で分岐させそれぞれの飛び先をべた書き指定すれば済む話 なのですがソースを簡略化させたく独自関数などで自動化できない ものかと思っております。 詳しい方がおりましたら是非アドバイスなど宜しくお願い致します。

    • ベストアンサー
    • PHP
  • form入力数字 をphpでurlの後ろ反映させる方法

    html の <form method="GET" action="post.php"> <input name="u_id" type="text" size="10"> <input type="submit" value="login"> </form> に入力された数字を以下のurlの後ろの●●に反映させhttp://localhost/schuler/php/pic/detail.php?num=●● ページを表示させたいのですが、どのように構文を作成すればよろしいでしょうか。 post.php ファイルを以下のように作成いたしましたが、全く反映されません。アドバイスをよろしくお願いいたします。 <?php $strKey = urlencode($_POST['u_id']); header("Location: http://localhost/schuler/php/pic/detail.php?num=$strKey"); ?>

    • 締切済み
    • PHP
  • URLエンコードした配列を使う方法

    <php $data[5] = array(6,4,3,7,9); ?> <a href='image.php? <?php print http_build_query($data,'','&'); ?> '>リンク先</a> リンク先へのURLの後ろにhttp_build_queryを使いつけて 送り側で$_GETで受け取って配列を使うようなことを しようと思ったのですが Undefined index: dataと言われてうまくいきません。 どのようにして配列を取り出せばよいのでしょうか?

    • ベストアンサー
    • PHP
  • php header

    <?php header("Location: http://www.example.com/"); exit; ?> 上記のheaderですと該当ページに飛んでしまいます。 直接飛んでしまうのではなく直接CGIにURLを送りたいのですが 関数等ありますか?わかりやすく言うとURLだけ送信したい。 clickした事にしたいです。

  • GETとheader

    お世話になっております。 適切な題名が思い浮かばず、「GETとheader」といたしましたが、以下のような流れの中(ソースは流れだけのものです)、 A.php $url = $http://www.○○.com/a.php?id=△△&key=□□//各キーの数は変動 header( "$http://www.○○.com/b.php?url=$url"); B.php $url=$_GET["url"]; header( "$url"); としたいのですが、このままだと、$http://www.○○.com/a.php?id=△△ までしか渡されず、b.phpにおいて、$urlをexplode関数により、分割してみたり、parse_url関数を用いて試してみたりしていますが、上手くb.phpからa.phpへ戻すことが出来ません。 適当な関数だけでも構いませんので、アドバイスなど頂戴できたら幸いです。宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • LocationにてHeader送信時にURLの#以降が消える

    初めて質問させて頂きます。よろしくお願いいたします。 LAMP構成にてWEBデータベースを作成しています。 Locationを使用したHeader送信の際、指定URLの特定の位置にリンク させるため、URLの最後に #を指定してリンク先を指定して いるのですが、実際にHeader送信されると、 目的のページはちゃんと開けますが URLの#以降が消えて指定の位置にリンクできません。 header("Location: {$_SERVER["PHP_SELF"]}?{$mySID}#{$myID}"); exit; もちろん、HTML側には、リンク先である、 <A name={$myID}></A> が指定されています。 ですので、ページが開いた後に、URLの最後に手で#999 などと 入れて再読込すると正しくリンクできます。 Apacheのアクセスログを見ると、#以降が無いURLがGET送信されていることが確認できました。 2つのサイトを作成しており、同じようなLocationを使用した Header送信を行っている箇所がいくつかありますが、 このような現象に遭遇した経験が無いもので、 どうしたらよいか途方にくれています。 何か、特定の条件にマッチした場合に、#以降の値が消えて WEBサーバーに送信される などということがあるのでしょうか? どんな小さいことでも、構いませんので、 どなたか、レスを頂けないでしょうか? どうぞ、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • URLエンコードされなかったパラメータを受け取る方

    Apacheのアクセスログに、URLエンコードされていない変数が正しく書き込まれているのですが、 PHPでがURLエンコードされていない変数が受け取れませんでした。 URLエンコードされずに送信されたデータはPHPでは受け取れないのでしょうか?

    • ベストアンサー
    • PHP
  • preg_replace内+URLエンコード

    現在、 $hogehoge=preg_replace( "/([^,\(\)]+)/" , '<a href="./hoge.php?hoge=\1">\1</a>', $hoge); このように変数をそのままリンク処理しております。 現在はこの変数に1バイト文字のみしか入っていないのですが、今後2バイト文字も取り扱おうつもりですので、urlencode関数を使いURLエンコードを組み込みたく思います。 このままのカタチで組み込むことは可能でしょうか?

    • 締切済み
    • PHP

専門家に質問してみよう