PHPのinclude_onceで外部ファイル化したサイトURLがリン

このQ&Aのポイント
  • PHPのinclude_onceを使用して外部ファイル化したサイトURLがリンクできない問題が発生しています。
  • サイトURLをurl.phpという外部ファイルにまとめて記述し、使い回しすることで管理を楽にしていますが、リンクをクリックするとページが存在しないという問題が発生しています。
  • 相対パスの解釈がおかしくなり、hrefタグの記述が正しくないため、リンク先が正しく表示されません。どのように修正すればよいでしょうか?
回答を見る
  • ベストアンサー

PHPのinclude_onceで外部ファイル化したサイトURLがリン

PHPのinclude_onceで外部ファイル化したサイトURLがリンクしてくれない。 Webサイト制作中ですが、サイトURLをいたるところに記述するのと、同じ構造のサイトをいくつも制作するので、使い回しにもなるということで、サイトURLだけを記述したurl.phpという外部ファイルを作成しました。 すると、少なくとも以下のような場合、リンクをクリックするとページが存在しないというページが開いてしまいます。 どうやら相対パスと勝手に解釈されてhrefタグの記述がおかしくなるようです。 どうやって直せるでしょうか? ●リンクをクリックして開いたブラウザアドレスバーに出たURLは以下です。 http://僕のサイト.jp/syohin/%EF%BB%BFhttp://xn--u9jxf0b3dt27s.jp ●ブラウザ下部のステータスバーに出ているリンク先は以下です。 http://僕のサイト.jp/product/http://xn--u9jxf0b3dt27s.jp ●HTMLの記述は以下です。 <a href="<?php include_once("url.php"); ?>" title="僕のサイト.jpのトップへ">僕のサイト.jpのトップへ</a> ●url.phpに書いた記述はサイトURLだけです。以下です。 http://xn--u9jxf0b3dt27s.jp url.phpを置いているディレクトリへのパスがおかしいのか?と思い、サイト最上階、つまりindexがある一番上の階層にurl.phpをアップロードしてもみたのですが、結果は同じでした。 以下のように「../」とつけてもダメでした。 <a href="../<?php include_once("url.php"); ?>" title="僕のサイト.jpのトップへ">僕のサイト.jpのトップへ</a> 外部ファイル化して共通部分を沢山つくているのでどうしても相対パスではダメな部分が沢山あるので何とかしたいのですが・・・

  • touchy
  • お礼率88% (704/796)
  • PHP
  • 回答数4
  • ありがとう数15

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

  • ベストアンサー
回答No.3

 PHPの仕様では、include_onceで読み込まれたファイルの先頭ではいったんHTMLモードに戻されます。そして、ファイルが終わったところでPHPモードになります。通常、includeするソースファイルでも「<?PHP」でPHPモードの始まりを記述し、最後に「?>」で括っても括らなくても動作するのはこのためです。  したがって、include_onceで読み込むファイルにテキストだけが書かれてあり、include_onceしているPHPのブロック内に他に処理がなければ、ファイルの中のテキストがPHPのブロック全体と置き換わります。  つまり、 > <a href="<?php include_once("url.php"); ?>" title="僕のサイト.jpのトップへ">僕のサイト.jpのトップへ</a>  この記述自体は間違ってないし、手元の環境で試したところではこれできちんと展開されるのですが……(もっとも、include_onceだから同一ファイル内で複数同じ記述があった場合はきちんと置き換わる保証はありません。こういう用途の場合はincludeの方が良いかな)  PHPの文法の問題じゃなくて、それ以外でURLが相対アドレスとして扱われる処理が働いているような気がします。  ところで、ここをinclude_onceせずに、url.phpの中身を直接記述した場合はどうなるのでしょう?

touchy
質問者

お礼

なんと、回答者様の環境では問題なくできるのですか!!・・・ いったいどうなってるんだろう・・・ > PHPの文法の問題じゃなくて、それ以外でURLが相対アドレスとして扱われる処理が働いているような気がします。 おっしゃるとおりでして、開いたWebページが http://xn--u9jxf0b3dt27s.jp/syohin/ にあるページだとしますと、このURLまでが何故か先頭について、その間に%とかFとかBとかの文字列が9文字ほど続いて、そのあとにurl.phpに書いているURLが入っています。以下のような感じのリンクURLになってしまうということです。 http://xn--u9jxf0b3dt27s.jp/syohin/%FB%BB%EFhttp://xn--u9jxf0b3dt27s.jp それとも、すでに外部ファイルであるfooter.phpにコレを記述して、そのまた外部ファイルがurl.phpなので、外部に外部となるのがいけないとでも言うのでしょうか?? ウ~ン・・・わからない・・・

touchy
質問者

補足

言い忘れていましたので補足欄で。 > ところで、ここをinclude_onceせずに、url.phpの中身を直接記述した場合はどうなるのでしょう? はい、これはですね、バッチリ問題なく普通にリンク先は開きますしブラウザのソースを開いても普通にURLだけ記述されています。 それと、include_onceでなくincludeだけにしたら、同じものを複数記述していたものが直りました! ありがとうございました

その他の回答 (3)

  • mpx
  • ベストアンサー率71% (149/209)
回答No.4

ANo2です。 申し訳ありませんでした この動きを誤解されているようです。 >> 私自身 以下PHPマニュアルより抜粋 ファイルが読み込まれるときには、読み込まれるファイルの先頭で PHPモードを抜けてHTMLモードになり、最後に再びPHPモードに戻ります。 このため、読み込むファイル中のPHPコードとして実行する必要がある コードは、 有効なPHPの開始タグおよび終了タグで括る必要があります。

touchy
質問者

お礼

とんでもありません、ということは、HTMLモードとして読まれるということだと思うので、 もともとの状態で記述としては間違っていないということだと理解いたしました。 No3様が書いておられる、別の要因ということなのか?と現在調査中です。 もし要因わかりましたらアドバイスいただけますと助かります。

  • mpx
  • ベストアンサー率71% (149/209)
回答No.2

<?php include_once("url.php"); ?> この動きを誤解されているようです。 ここは、url.phpの内容を読み込んで、それを実行した結果が 出力されることになります。 url.phpの内容がそのまま出力されるわけでは有りません。 つまり >> ●url.phpに書いた記述はサイトURLだけです。以下です。 >> http://xn--u9jxf0b3dt27s.jp URLしか書いていないので、http://xn--u9jxf0b3dt27s.jp を 読み込んで、それを実行した結果(当然エラーなのでエラー表示内容)が 出力されます。 よって、url.phpの内容を echo 'http://xn--u9jxf0b3dt27s.jp'; に変更してみてください

touchy
質問者

お礼

ありがとうございます。 echo 'http://xn--u9jxf0b3dt27s.jp'; にしてみましたがダメでしてリンククリックしても長ったらしいURLが出てきてページは開きませんでした。

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

>%EF%BB%BF これってボムつきutf8のような気がする そのurlファイルを何で作ったのかは知らないけれど、 url だけの記述ならASCII(または、latin1)保存して下さい。

touchy
質問者

お礼

ありがとうございます、おっしゃるとおりで、BOMなしでダメだったのでBOM付きでやってみたのを記載しておりました。 やはりBOM無しでやらないといけないようですね。ありがとうございます。

関連するQ&A

  • include_onceで呼び出したPHPファイル

    PHPでサイトを組んでいるのですが、include_onceで以下のようにPHPの各ファイルを呼び出して実行しているのですがうまくいきません。 <?php //レンタルサーバーのcronを利用して、定期的に走らせるコードです。 include_once "example_a.php"; include_once "example_b.php"; include_once "example_c.php"; ?> 各ファイルは、RSSで読み込んだデータをMySQLに格納するプログラムです。 個別で各ファイルを実行すると正しい結果となりますが上記のようなプログラムでまとめて実行するとexample_a.phpは正しい結果となりますが、example_b.php、example_c.phpは正しく処理されません。 原因として考えられるものがあれば、教えていただきたいと思います。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Webページでphpを使って共通部分を外部ファイルすると文字化けする。

    Webページでphpを使って共通部分を外部ファイルすると文字化けする。 Webサイトを制作中ですが、Webページを全て.phpファイルで制作しています。 これによってWebサイトにおける色んな共通部分を外部ファイル化して、のちの変更を簡単に済ますように構成しています。 そして、 ●Global Navi ●Sidebar Navi ●Header ●Metaタグ ●Footer 等、これまで制作した外部ファイルは全てうまくいっていたのですが、先ほど制作した外部ファイルが文字化けでうまくいきませんでした。どうすれば文字化けが直るでしょうか? 外部ファイルに記述したのは、単に日本語のサイトタイトルただそれだけです。 パン屑ナビに記述するサイトタイトル(これがうまくいけばその他のサイトタイトルを記述しているところ全部に適用させたい)で使うと文字化けしました。HTMLは以下のような記述です。 <!--Breadcrumb--> <div id="navi_bread"> <p><a href="http://xn--u9jxf0b3dt27s.jp"><?php include_once("../inc/sitetitle.php"); ?> TOP</a>&nbsp;&gt;&nbsp;商品案内</p></div> <!--/Breadcrumb-->

    • ベストアンサー
    • PHP
  • php_value include_pathを無効

    php_value include_pathを、あるディレクトリ以下では、無効にしたいのですが、 どうすればよいでしょうか? ■前提 ・サイト全体は、「.htaccess」に「php_value include_path」を書いて制御 ■やりたいこと ・ある特定ディレクトリ「hoge」以下では、「php_value include_path」ではなく、 PHPに直接書いた「require_once './★★/●●';」を利用したい ・つまり、設定ファイル「.htaccess」に記述した中のある一部分(特定ディレクトリ以下)だけは、「PHPソースに記述」したincludeパスを使いたい ■試してみてダメだってこと ・「hoge」に「.htaccess」を設置し、空の「php_value include_path=""」と書いてみたけど、うまくいきませんでした

    • ベストアンサー
    • PHP
  • include,requireで外部URLの呼び込み

    include,requireのどちらでもいいのですが、別ドメイン或いは同ドメイン内における違う階層のファイルなど(例えば外部のhttp://www.ooxx.sample)を呼び込む際に、呼び込み先のリンクや画像パスが相対バスではうまくいきません。呼び込み先のリンク、画像パスを絶対URLにすれば問題ないと思いますが、作業が困難になるので避けたいです。 PHPでinclude,requireの使い方は向かないのでしょうか?或いは、他の方法で回避できる方法はないのでしょうか? (SSIやHTMLでインラインフレームみたいなことは使わない)

    • 締切済み
    • PHP
  • PHPのインクルードの方法(初心者です)

    サイトの管理を一括で行いたいと思い、 いろいろ調べたところPHPのインクルードという方法を知りました。 いろいろなサイトを見て、その通りに実行してみたのですが、 500エラーになってしまいます(泣) やってみたのは以下の通りです。 1、「.html」なので「.htaccess」というファイルに AddType application/x-httpd-php .htm .html と記述してアップロード。 2、インクルードしたい部分をメモ帳に貼り付け、「●●.txt」で保存しアップロード。 3、メモ帳にコピペした部分を削除して、 <?php include_once("http://●●.com/▲▲.txt"); ?> と記述。 以上です。 詳しくわからないのですが、何階層にもなりそうなので 相対パスなら、いちいち指定するのに手間が掛かるので 絶対パスというので指定したいのですが、 「PERLの絶対パス」とか意味がわかりません(汗) 3のようにURLで指定するのは間違っているのでしょうか? いろいろいじってみたのですが、 一体どこがおかしいのかわかりません。 どなたかご教授お願いいたします。

  • 外部ファイルを読み込んだhtmlをinclude

    外部ファイルを読み込んだhtmlをincludeしたいです。 ディレクトリの階層は、 index.php style.css /pic/picture.html /pic/css/style1.css /pic/css/style2.css : /pic/css/style13.css /pic/js/jquery1.js /pic/js/jquery2.js : /pic/js/jquery15.js : (画像などが他にもいっぱい) となっています。 ----- picture.html内には <link rel="stylesheet" type="text/css" href="css/style1.css"> <link rel="stylesheet" type="text/css" href="css/style2.css"> : <link rel="stylesheet" type="text/css" href="css/style13.css"> <link rel="stylesheet" type="text/css" href="js/jquery1.js"> <link rel="stylesheet" type="text/css" href="js/jquery2.js"> : <link rel="stylesheet" type="text/css" href="js/jquery15.js"> : と書かれています。 ---- このときindex.phpのbody内に <?php include('./picture.html'); ?> とした場合、相対パスによる記述なのでpicture.html以外のcssやjsは適用されませんよね。 しかし/pic/内にあるすべてのpicture.htmlに関係するファイルは非常に数が多いので、これらすべてをincludeするのは厳しいです。 すべての外部ファイルを読み込んだ状態のpicture.htmlをbody内に表示したいのですが、そんなことは可能でしょうか。 どなたかご教示ください。どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP5で自動的にinclude_once

    概要:Apache 2 + PHP5 において、すべてのスクリプトに自動的に、include_onceのような効果を得る方法について教えてください。 詳細: 昔開発していたPHPスクリプトにおいて スクリプト中に include_once や require_once を書かずに スクリプトが呼び出される度に、スクリプトの冒頭で include_once したかのように、パスの設定などを行う初期化スクリプトを include して実行させる方法を取っていたはずなのですが、そのやり方を忘れてしまいました。 初期化スクリプト中では define などをして、スクリプトが依存するライブラリやデータのパスの設定を変数に対して行っており、処理コストの低い簡単な処理も入ります。 すべてのスクリプトにおいて、その変数が示すパスを使ってデータの読み書きを行っています。 その手法は、Apache2 が多目的に使われる場合には、オーバーヘッドあるいは弊害があるだろうというようなものだったと思います。(当時そう思った事をなんとなく覚えている次第です) Apache2がリクエストを受け取る度に、実行されるため、そのスクリプトと関係のない php スクリプトが呼ばれた際にも自動的に取りこまれてパスなどが変数に設定されます。 その Apache 2 は、限定的な用途で利用され、サーバーマシンごと特定用途で利用することを前提としていたため、そういった手法をとったのだと思いますが、詳細は不明です。 おそらく、apache2.conf (あるいは httpd.conf) か php.ini に設定していたと思うんですが、当時の設定ファイルを読み解いても、それらしい記述が見当たらず、ここ数日悩んでおります。 一応、実行環境について書きますと 当時の実行環境は、Windows 2000 + Apache 2 + PHP 3~5(?) + PEAR + MySQL 3(?) で、現在は ubuntu + Apache 2 + PHP5 + PEAR + MySQL 5 で動かそうとしております。 このような内容なのですが、お心当たりのある方は、ご教示お願い致します。

    • ベストアンサー
    • PHP
  • includeとinclude_onceの使い分け

    まずマニュアルを。 ------------------------------------------------------ PHP: include_once - Manual http://www.php.net/manual/ja/function.include-once.php include_once 命令は、スクリプトの実行時に指定したファイルを読み込み評価します。この動作は、include 命令と似ていますが、ファイルからのコードが既に読み込まれている場合は、再度読み込まれないという重要な違いがあります。その名が示す通り、ファイルは一度しか読み込まれません。 include_once は、スクリプトの実行時に同じファイルが複数回読み込まれ、評価される可能性がある場合に、関数の再定義や 変数値の再代入といった問題を回避するために一回だけ読み込ませるために使用します。 ------------------------------------------------------ …。表面的な機能の違いはわかりました。しかしそれをどう使い分けるのかの説明はなく、分かりませんでした。 よく分からない点は以下です。 ・同じファイルを何度も「include」もしくは「include_once」するケース ・あえて何度も記述しながら実際には1度しか評価してほしくないケース ・何度も記述して、そのつど評価したいケース これらについて例を挙げて教えていただきたいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP include_once

    include_onceで読み込んだファイルが そのままテキストとして出力されてしまいます。 以下のような感じです。 インクルードするファイル fail.inc test_val = array("aaa" => "aaa111", "bbb" => "bbb222", "ccc" => "ccc333"); ソース本体 src.php <?php include_once('./fail.inc'); 以下処理 exit(); ?> これをそのまま実行すると以下のように出力されます。 test_val = array("aaa" => "aaa111", "bbb" => "bbb222", "ccc" => "ccc333"); includeせずにそのまま走らせると正常に動きます。 httpd.confのaddtypeにincという拡張子は追加していませんが 他の同様のソースでは問題なく読み込めます。 require_onceとかも試しましたが同じようにfail.incの中身がそのままテキストとして 出力されてしまいます。 どうしたら正しく読み込めますでしょうか。 ご回答よろしくお願いしますm(_)m

    • ベストアンサー
    • PHP
  • phpで外部ファイルを読み込んだ際のURLについて

    Webサイト全ページのヘッダーとサイドバー、フッターは同じ内容です。 そのため、Webサイトを更新するときの作業効率を考えて外部読み込みをしようと思っております。 以下の手順で、phpのincludeを使って、一応読みこむことはできました。 (1)「index.html」を「index.php」に拡張子を変更 (2)「index.php」の読みこませたい部分に次のように記述 <?php include('./header.html'); ?> (3)「header.html」を作成 以上の手順で、FFFTPでアップロードして、ブラウザで表示したら、読みこみに成功しておりました。 しかし、当然といえば当然なのですが、次ようにサイトのurlの拡張子がhtmlからphpに次ようになっておりました。※urlはダミーです。 http://www.sample777.com/index.php このままだと、全てのページのurlの拡張子がphpになってしまいます。 この場合、seoやユーザービリティ―などの観点から、何か問題はありますか? urlに表記されるphpの部分をhtmlのままにしたいのですが、何か方法はありますか?

    • ベストアンサー
    • PHP

専門家に質問してみよう