LocationにてHeader送信時にURLの#以降が消える

このQ&Aのポイント
  • LAMP構成にてWEBデータベースを作成し、Locationを使用したHeader送信時にURLの#以降が消える現象に遭遇しています。
  • Header送信された後、指定の位置にリンクできず、URLの#以降が消えます。
  • 特定の条件にマッチした場合、#以降の値が消える可能性があるのか疑問に思っています。
回答を見る
  • ベストアンサー

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
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
noname#30334
noname#30334
回答No.4

現象確認しました。確かに#以降が抹消されます。 ただし、IEの場合に発生します。Firefoxの場合は、問題ありません。 IEのバグ?仕様?・・・だとしたら、PHPでは無理かもしれませんねぇ。 回避策としては、METAタグでrefreshさせる方法が上手く行きそうです。 print "<META http-equiv=\"refresh\" content=\"0;url={$_SERVER["PHP_SELF"]}?act=gamen2#{$myID}\">";

tsuyuchobi
質問者

お礼

tdsh様 レスありがとうございます。 >ただし、IEの場合に発生します。Firefoxの場合は、問題ありません。 そうなんですかっ! IEだけで確認してたので、Firefoxでも確認してみます! やはり、ブラウザは複数で確認しないとだめですね。 早速、後で、Firefoxもインストールします。 >IEのバグ?仕様?・・・ >だとしたら、PHPでは無理かもしれませんねぇ。 ですよね! >回避策としては、METAタグでrefreshさせる方法が >上手く行きそうです。 なるほど!その手がありましたか! こちらでも、回避作を模索していて、 戻るリンクの部分だけを別のFORMタグで囲んでSUBMITさせると うまくいくことが確認できました。 tdsh様にご提示いただいた回避作か、戻るリンクだけ 別FORMタグで囲むか、どちらかの手をつかって、回避してみます。 数日に渡り、レスを頂き、本当にありがとうございます。 自分も、いつか、tdsh様のように、回答する側になれるよう 精進いたします! 本当にありがとうございました!

その他の回答 (3)

noname#30334
noname#30334
回答No.3

No.2です。 環境を変えたりして、試してみましたが、現象を再現できず、 調べてみるも、これといった解決策が見つかりませんでした。申し訳ないです。 以下、一応参考意見という事でご了解下さい。 1.Apacheのログ >Apacheのアクセスログを見ると、#以降が無いURLがGET送信されていることが確認できました。 私も今回はじめて気付いたのですが、IE6でアクセスすると、ログに#以降も残るのですが、 Firefoxでアクセスすると、#以降が残っていませんでした。(動作は問題なかった) 2.aspにて 実は数年前、IIS + asp の環境で同じ現象が起きた事がありました。 (今回、IIS + PHPの環境で試すが正常に動作。。。) 結局、その時も解決出来なかったのですが・・・ 「?・・・」が無ければ、「#・・・」が有効である事が分ったので、 併用しない方法で回避しました。(詳細は忘れました。。。) 何かヒントになれば幸いです。

tsuyuchobi
質問者

お礼

tdsh様 レスいただき、本当にありがとうございます。 一人で悶々と悩んでいる時に、相談にのっていただける方が いると、それだけで、「あきらめずに、がんばろう!」と 思えます。 ところで、現象再発を確認できた、単純ソースを アップしようとしたのですが、文字数制限にひっかかってしまったので No.1の回答の補足としてアップしました。 ご確認いただけると幸いです。 最初に提示すべきでしたが、こちらの環境は、 Red Hat Linux 9 + Apache2 + MySQL4.1 + PHP5.0です。 それでは。

tsuyuchobi
質問者

補足

No.2様 再びのレス 本当にありがとうございます。 あれから、調査を続行しても、どうにも、 解決への糸口が見つからなかったので、 該当のFUNCTIONを丸ごと一度捨てて、 数行ずつソースを加えるごとに #以降が消えるかどうかを、確認しました。 その結果、#以降が消える・消えないに影響を与えていると 思われる箇所を見つけました。 思いもよらなかった箇所なんですが、 ・FORMタグの中に、enctype="multipart/form-data" が あると #以降が消える ないと #以降は消えない 又は、 ・FORM中の ファイルアップロード用のタグ <INPUT type=file name=userfile> のname属性が あると #以降が消える ないと #以降は消えない 又は、 ファイルアップロード用のタグをまるごと消すと #以降は消えない ということが判明しました。 (※単純ソース(少し長いですが・・・)を作成しまして、 現象の再発を確認できましたので、この文章の最後に 記します。) 因みに、#以降が消える現象は、 上記のenctype, INPUT type=file のタグがある、ない の状況で絶対発生するものではなく、 プログラムの作りも関係しているようです。 ファイルのアップロードをさせているページが 他にもいくつも存在するのですが、 そちらでは、この現象は発生しないのです!!! なので、作り? の問題と、enctype の問題が からみあって、発生しているのかな???などと 勝手に思っているのですが、どうなんでしょう。。。 ※ソースをアップしようとしたら、 文字数制限にひっかかりましたので、別に上げます。

noname#30334
noname#30334
回答No.2

こちらの環境では、問題なく動作しますねぇ。 Apache2.0 + PHP4.3 (CentOS4.4) > header("Location: {$_SERVER["PHP_SELF"]}?{$mySID}#{$myID}"); ところで、このまま動かすと無限ループしてしまうので、 条件の中に入っていると思うのですが、 他に、#以降が無いHeader送信をしている箇所は、無いんですか? 条件文が間違ってて、そっちが動いていたりとか。。。

tsuyuchobi
質問者

補足

早速のレスありがとうございます。 >ところで、このまま動かすと無限ループしてしまうので、 実際のLocation以下のアドレスはもっと長いので、省略して記しました >条件の中に入っていると思うのですが、 はい、実際は条件の中に入っております。 >他に、#以降が無いHeader送信をしている箇所は、無いんですか? ご指摘いただいて、私も、もしかして・・・と思い、 調べてみましたが、Header送信している部分は、完全に全て #以降があり、#以降が無いものは一つもありませんでした。。。 本日も、いろいろと調べてみたのですが、 やはり、header送信した後に、PHP側?にてアドレスが いじられ、#以降が消されているようにしか思えないのです。。。 #{$myID} の部分を試しに &{$myID} に変えると ブラウザのアドレスバーのURLの一番最後に &999 などと表示されるのですが、 これを #{$myID}に戻すと #以降はやはり、消えてしまいます。 土曜日で会社休みなのですが、気になってしょうがなくて 調べてますが、未だ分からず・・・ うーーん。。。なんなんでしょう・・・。

回答No.1

PHPは詳しくないんですけど、 #ってコメントアウトなんじゃないですか? エスケープ文字があるはずなので#の前につけてみたら どうでしょう? \#とかかな? 勘ですが!!

tsuyuchobi
質問者

補足

すいません。質問者です。文字数制限の為、tdsh様に対する 返信ですが、ここを間借りさせて下さい。 以下 現象確認用サンプルソースです <? //------------------------------------------------- // gamen1 //------------------------------------------------- function gamen1() { if (isset($_POST["edit_flg"])) { $edit_flg = $_POST["edit_flg"]; } switch ($edit_flg) { case "save": $myTag = "<P>更新ボタンが押されました</P>"; break; case "back_gamen2": //#以降の番号を適当に指定 $myID = 48; header("Location: {$_SERVER["PHP_SELF"]}?act=gamen2#{$myID}"); break; default: //enctypeあり, inputのnameあり の場合 #以降は無効となる $myTag0 = "<FORM name=edit_frm enctype=multipart/form-data " ."action={$_SERVER[PHP_SELF]} Method=POST>\n" ."<A href=javascript:act_test('back_gamen2');>" ."gamen2に戻る (myTag0)</A><BR>\n" ."<INPUT type=file name=userfile><BR>\n"; //enctypeなし, inputのnameあり の場合 #以降は有効となる $myTag1 = "<FORM name=edit_frm action={$_SERVER[PHP_SELF]} " ."Method=POST>\n" ."<A href=javascript:act_test('back_gamen2');>" ."gamen2に戻る (myTag1)</A><BR>\n" ."<INPUT type=file name=userfile><BR>\n"; //enctypeあり、inputのnameなし の場合 #以降は有効となる $myTag2 = "<FORM name=edit_frm enctype=multipart/form-data " ."action={$_SERVER[PHP_SELF]} Method=POST>\n" ."<A href=javascript:act_test('back_gamen2');>" ."gamen2に戻る (myTag2)</A><BR>\n" ."<INPUT type=file><BR>\n"; //enctypeあり、input type=fileのタグ自体なし の場合 #以降は有効となる $myTag3 = "<FORM name=edit_frm enctype=multipart/form-data " ."action={$_SERVER[PHP_SELF]} Method=POST>\n" ."<A href=javascript:act_test('back_gamen2');>" ."gamen2に戻る (myTag3)</A><BR>\n"; //#################### //myTagの指定 ※ここを変えてみてください! //$myTag0 = だめ! //$myTag1,2,3 = うまくいく! //#################### //ここから $myTag = $myTag0; //ここまで //#################### $myTag .="<INPUT type=button value=更新 onclick=act_test('save');><BR>\n" ."<INPUT type=hidden name=edit_flg value=>\n" ."</FORM>\n"; } ?> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=euc-jp"> <META http-equiv="Content-Script-Type" content="text/javascript"> </HEAD> <SCRIPT language=JavaScript> <!-- function act_test(paactflg) { with (document.edit_frm) { switch (paactflg) { case "save": //入力された値のチェック //省略 break; case "back_gamen2": //gamen2に戻る //戻る前作業 省略 break; } edit_flg.value = paactflg; submit(); } } --> </SCRIPT> <BODY> <?=$myTag?> </BODY> </HTML> <? } //------------------------------------------------- // gamen2 //------------------------------------------------- function gamen2() { for ($i=0;$i<50;$i++) { $myATag .= "<A name={$i}>No.{$i}</A><BR>"; } $myTag = "<P>戻るリンクが押されました</P><BR>" .$myATag; ?> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=euc-jp"> <META http-equiv="Content-Script-Type" content="text/javascript"> </HEAD> <BODY> <?=$myTag?> </BODY> </HTML> <? } //------------------------------------------------- // main //------------------------------------------------- if (!isset($act)) { if (!isset($_GET["act"])) { $act = "gamen1"; } else { $act = $_GET["act"]; } } switch ($act) { case "gamen1": gamen1(); break; case "gamen2": gamen2(); break; default: gamen1(); }

関連するQ&A

  • header(Location)で相対URL指定方法?

    お世話になります。 $_SERVER['HTTP_REFERER'] を使って得た値からheader(Location~) でURLを指定したいのですが 調べてみたら、絶対URL指定以外は 駄目みたいなのですが。 色々調べてみたのですが イマイチ、ピンときません。 あまり難しくない方法はないのでしょうか? 他の指定方法とかはないのでしょか? 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • header Locationに関するエラー

    こんにちわ。質問があります。 以下のコードに問題はありますか? "http://xxx.xxx.xxx.html"(仮名)というURLからアクセスした場合は リンク元を表示し、その他からのアクセスの場合は、google.co.jpに飛ぶというプログラムです。 header:Locationの使い方がおかしいらしく、エラーとなってしまいます。 どこに問題がありますでしょうか?ご教示いただけますと大変助かります。 どうぞよろしくお願い申し上げます。 ------------------------------------------------------------- <?php $referer=$_SERVER['HTTP_REFERER']; echo 'referer = '; echo $referer; echo '<br>'; if($referer == "http://xxx.xxx.xxx.html") { echo 'from '; echo $referer; } else { $url="http://www.google.co.jp/"; header("Location: $url"); exit; } ?>

    • ベストアンサー
    • PHP
  • header('Location: http://www.exampl

    header('Location: http://www.example.com/'); PHPによる上記リダイレクト処理を、ブラウザ側で拒否できるような機能は存在するのでしょうか? そもそもこのリダイレクト処理というのはサーバサイドで動いているものなのでしょうか? 仕組みがよくわかりません。 たとえばDBにデータを登録後、リダイレクトでメール送信処理ページへ飛ばし、ユーザに登録内容をメールで送る、ということをしても問題ないのでしょうか? とりあえず画面遷移を拒否される可能性があるかないかだけでも教えてください。

    • ベストアンサー
    • PHP
  • header("Locationとリロードについて

    Chromeでリロードしても、header("Location がうまくいきません。 リロードした際も、URLを遷移させるにはどうすればいいでしょうか? ▼index.php <?php  header("Location: http://yahoo.co.jp/");  exit; ?> ・URL入力後、右クリック&再読み込み → 遷移しない ・URL入力後、F5 → 遷移しない ・URL入力後、URL入力欄左にある「このページを再読み込みします」のマーク → 遷移しない(遷移するときもある?) ・URL入力後、Enter → 遷移する ・URLを「貼り付けて検索」 → 遷移する 後、Chromeで、以下の3つに何か違いはあるのでしょうか? ・右クリック&再読み込み ・F5 ・URL入力欄左にある「このページを再読み込みします」のマーク

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

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

  • 環境をかえたら header(Location:)に不具合が?

    ローカル環境からWEBサーバに作ったPHPファイルを移動させたのですが、 header(Location:)がうまく動かなくなってしまいました。 アドレスがおかしいのかと思って いくつか試してみたんですが ファイルによってうまく行くのと行かないのがあるようです。 傾向としては $chkに5が入っていたら test.phpに移動する。 if($_SESSION['chk'] != '5'){  header('Location: ./test.php');  exit; } はうまく動くのですが ifでいくつか処理を行ったあとに if(isset($_POST('submit')){  いくつかの処理  header('Location: ./login.php'); } とするとうまく動かないという状態です。 どのようなケースが考えられるでしょうか アドバイスよろしくお願いします。

    • ベストアンサー
    • PHP
  • header("Location: mailto:

    header("Location: mailto: でメーラを開く時、本文を改行させたらエラーになるのですが、回避する方法はありませんか? <?php // 送信ボタンが押されたら if (isset($_POST["submit"])) { $wk_adrs = "web@test.sakura.ne.jp"; $wk_subject = "サブジェクト"; // これはOK $wk_body = "ボディー"; // これはNG $wk_body = "1行目ボディー".PHP_EOL."2行目ボディー"; // これもG $wk_body = <<< EOM 1行目ボディー 2行目ボディー EOM; // 画面遷移させる $wk_Location="Location: mailto:".$wk_adrs."?subject=".$wk_subject."&body=".$wk_body; header($wk_Location); exit; } ?> 下記のメッセージが出る Warning: Header may not contain more than a single header, new line detected in

    • ベストアンサー
    • PHP
  • header("location~")をPOSTで渡す方法を探しています

    phpでの質問です。 header("location~")をPOSTで渡す方法を探しています。 携帯サイトなのでJavascriptは使えません。 shift-jisのサイトからutf-8のサイトへ渡します。 (1)307でリダイレクト header('Location: '.$url, true, 307); =>POSTの文字コードを変換できないのでダメでした。 (2)POSTで送信してからリダイレクト http://questionbox.jp.msn.com/qa3554188.html?StatusCheck=ON =>うまくいきません。やり方が悪いのかもしれません…。 送り元のサイトの文字コードをutf-8にしてしまえば解決するのですが、携帯サイトなのでshift-jisにするしかありません。 (最近ではほとんどの機種がutf-8対応になっていますが、社長の機種が対応していなくて…) よろしくお願いします。

    • ベストアンサー
    • PHP
  • クライアントの指定したURLのHOST名を取得したい

    クライアントの指定したURLのHOST名を取得したい PHPでWebページを作成しました。 クライアントより記入されるURLのHOST名が"www"がつく場合と、 つかない場合があります。 クライアントの送信したURLのHOST名の文字列を取得する方法はありますか? もしくは、トップページで必ず既定のURL(HOST名固定)に飛ぶようにする方法はありますか? header("location:...")の方法は知っているのですが、.htaccess等で指定する方法 があったら、助かります。 どうか、お願いいたします。

    • ベストアンサー
    • 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