相対 URL

絶対 URL は、http:// から始まる絶対的な位置ですが、相対 URL は基準とするファイルからの相対的位置を示します。通常、自分の Web ページ内の URL は相対 URL で記述されます。オフラインでデバックしたり、ファイルを移動させたりするときに便利だからです。
次のようなディレクトリとファイル構造の場合の相対 URL の書き方を示します。h1_1.html を基準とした場合、それぞれのファイル位置は次のように表されます。'/' はディレクトリの移動を表し、 '..' はフォルダーを上流に一つ上がることをあらわします。'.' は、基準とするファイルと同じディレクトリをあらわします。

<a href="h1_2.html">h1_2.html</a>
又は  <a href="./h1_2.html">h1_2.html</a>
<a href="h1c_dir/h1c.html">h1c.html</a>
又は  <a href="./h1c_dir/h1c.html">h1c.html</a>
<a href="../h2_dir/h2.html">h2.html</a>

 の記号は、ディレクトリを表します。

  • web_dir
    • h1_dir
      • h1_1.html
      • h1_2.html
      • h1c_dir
        • h1c.html
    • h2_dir
      • h2.html
    • common_dir
      • navi.html
    • php_dir
      • r_path.php
      • rel_navi.php
      • fix.html

相対 URL を汎用化する

たとえば、自分の Web ページ内の全てのページへのリンクリストを考えて見ましょう。自分と同じディレクトリのファイルもディレクトリの階層をドメインのあるディレクトリまで上がって、ドメインの下位のディレクトリからファイルを指定すれば、ある程度汎用化できます。次のように記述します。

common_dir/navi.html

<ul>
<li><a href="../h1_dir/h1_1.html">h1_1.html</a></li>
<li><a href="../h1_dir/h1_2.html">h1_2.html</a></li>
<li><a href="../h1_dir/h1c_dir/h1c.html">h1c.html</a></li>
<li><a href="../h2_dir/h2.html">h2.html</a></li>
</ul> 

ある程度と言うのは、ディレクトリの位置が実行しているファイルと同じ階層の深さにある場合には汎用と言う意味です。上記リストは、同じ階層位置にある h1_dir と h2_dir ディレクトリ内にあるファイルでは利用できますが、階層位置の違う h1c.html には、使用できません。h1c.html で利用するときは、'../' の部分を '../../' としなければなりません。
そこで、全ての階層位置のファイルから共通に使えるよう、自分の階層位置を検出してしまいましょう。r_path.php のように記載します。preg_replace($web_dir,null,dirname($_SERVER['PHP_SELF']),1) は、ドメイン(ここでは、ドメインのディレクトリは web_dir とします)から下のディレクトリパスを取り出します。h1_1.html 内に記述した場合は、'/h1_dir' となります。h1c.html 内に記述した場合は、'/h1_dir/h1c.html' です。これを正規表現で '/' で囲まれた部分を '..' に置き換えています。結果は、$r_path に入ります。'/h1_dir/h1c.html' は '../..' となります。

php_dir/r_path.php

<?php
$web_dir = '/.*\/web_dir/';//ローカルでもドメインと相対 URL を合わせる
//このファイルのからドメインまたは $web_dir までのパス(最後に"/"ない)
$full_dir =  preg_replace($web_dir,null,dirname($_SERVER['PHP_SELF']),1);
$pattern ="/[^\/]+/";//"/"以外の1つ以上の文字
$r_path = ltrim(preg_replace($pattern,"..",$full_dir),"/");//最初の"/"を削除
$r_path = ( $r_path == "" ) ? "." : $r_path ;//"/"だけか""だったら"."
?>

rel_navi.php は、navi.html のリストの '../' の部分を r_path.php で検出した階層位置 $r_path に置き換えて出力するスクリプトです。このスクリプトの中で、 $r_path."/common_dir/navi.html" という相対 URL で navi.html を呼んでいます。$r_path を利用することで、このファイルがどの階層のディレクトリにあっても、大丈夫になりました。

php_dir/rel_navi.php

<?php  // $file_nameファイルの$string1を$string2に置き換えてインクルード
$file_name = $r_path."/common_dir/navi.html";//汎用ファイル名
$string1 = "../" ;//汎用ファイルに書いてある階層
$string2 = $r_path."/";//ドメインまでの階層
$include_txt = file_get_contents ( $file_name ) ; //ファイルを全て読み込む
$ch_txt = str_replace ( $string1,$string2,$include_txt ) ; //文字列置き換え
echo $ch_txt ; // 置き換えたテキストを表示
?>

これで準備ができました。それでは、navi.html を汎用的に使ってみましょう。
h1_1.html の記述について説明します。( html の拡張子で PHP が実行できる設定になっていることが前提です。もし、なっていない場合は、.htaccess で設定してください。)"../php_dir/inc_path.php" は、インクルードパスを php_dir に設定するスクリプトです。残念ながら、ここだけは、相対 URL を階層ごとに設定する必要があります。.htaccess でインクルードパスが設定可能な場合、このファイルを呼ぶ必要はありませんので、完全に汎用化できます。
"r_path.php" をインクルードした後に "rel_navi.php" をインクルードするだけで、navi.html を汎用的に使うことができます。もちろん "fix.html" のように、相対 URL の含まれていいないファイルは、そのまま直接インクルードするだけです。 "fix.html" 内には、「全てのページで共通な記述(フッターやヘッダーなど)」と記述してあります。
このように、汎用的なファイルをインクルードパスで指定したディレクトリに置くことにより、どの階層のディレクトリからも、ファイル名(又は、インクルードパスが指定したディレクトリからの相対 URL )で呼ぶことができます。これで、共通ファイルの部品化ができましたので、もし修正の必要があっても共通ファイルを修正するだけで済みます。
サンプルを用意しましたので、確認してみてください。
サンプル: 汎用的に相対 URL を使うサンプル

h1_dir/h1_1.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<meta http-equiv="content-style-type" content="text/css">
<title>h1_1.html のサンプル</title>
</head>
<body>
<!-- .htaccess でインクルードパスが設定できないとき -->
<?php include("../php_dir/inc_path.php"); ?>

<p>このファイルは、h1_1.html</p>

<?php include("r_path.php"); ?>
<?php include("rel_navi.php"); ?>
<?php include("fix.html"); ?>

</body>
</html>

PR amazon

author

サイト管理人:パワーデジット
管理人への連絡フォーム

スポンサード リンク

このページは 

トップページ > PHP > 汎用相対 URL