dポイントプレゼントキャンペーン実施中!

よろしくお願いします。
いま,navi.php内で同一ディレクトリ内のstyle.cssを読み込もうとしています。navi.phpは色々なディレクトリから取り込まれるため,どこから取り込まれてもstyle.cssにリンクできるようにしたいのです。絶対URLは使いたくありません。
調べていたら,dirname(__FILE__)を使えば良いと分かったのですが,hrefの中に取り込むやり方が分かりません。御指南ください。
<link rel="stylesheet" href="<?= dirname(__FILE__) ?>/style.css" type="text/css">
は試したのですが,うまくいきませんでした。

A 回答 (4件)

絶対URLを使いたくない理由というのがなんなのかによるのですが、


HTMLのBASEタグを利用されてはどうですか。
http://www.htmq.com/html/base.shtml

<base href="http://example.com/dir/" />

こんな感じでHTMLに挿入してやれば、そのHTML中のsrcやhrefなどは、その指定したパスから見た相対パスを引くことが出来ます。
上記が書かれている状態で、
<link rel="stylesheet" href="css/style.css" type="text/css" />
などと記述してやれば、それは、「http://example.com/dir/css/style.css」を読むとみなします。
これであれば、HTML中の一箇所のみを変更すれば良くなり、更新も楽かと思います。
もしくは、絶対URLではなくて、絶対パスで指定してやれば、同様なことができるのではないかと思いますがいかがでしょう。
<link rel="stylesheet" href="/dir/css/style.css" type="text/css" />
このようにパスの先頭に「/」を指定してやれば、「http://example.com」以下の最初のパスから指定するということになります。

また、テスト環境と本番環境で書き換えなきゃいけないのが面倒だという理由なのであれば、
<base href="<?php echo $URL?>" />
として、
PHPスクリプト中に、
<?php

if(file_exists(dirname(__FILE__).DIRECTORY_SEPARATOR."test.txt"){
$URL = "http://localhost/"; //テスト環境のURL
}else{
$URL = "http://example.com/"; //本番環境のURL
}


?>
といったような記述をしてやって、テスト環境のディレクトリにだけ「test.txt」をおいてやれば
本番にUPするための修正が少なくなると思います。

いかがでしょうか。
    • good
    • 0

#1です。



思いっきり誤報ですみません。

ローカルでしかやってなかったんで気がつきませんでしたが、
アップロードしてみたらlinuxのフルパス返してくれてました。
PHP内部で処理している分には、よかったのですが、
URLとなると、#2さんの方法でないと 無理っぽいです。
    • good
    • 0

navi.php 内で dirname(__FILE__)すると、navi.php の存在するディレクトリが取得できますが、それをそのまま指定しただけでは、読み込み元のPHPからnavi.php を読み込んでいるディレクトリにはたどり着けません。

読み込み元のPHPのパスを逆に辿る必要があります。

例えば、/path1/path2/show.php が /path3/navi.php を読み込んでいる場合、
navi.php と同じディレクトリのstyle.css を参照するには、
「../../path3/style.css」を指定する必要があります。
navi.php の __FILE__ からは「path3」を作り出すことはできますが、それだけではダメで、
「../..」を、show.php の方のパス($_SERVER[SCRIPT_FILENAME]から作り出す必要があります。

コードにすると、
---ここから---
<?php
function relativepath($srcfile, $dstfile) {
$srcdir=split('/', realpath(dirname($srcfile)));
$dstdir=split('/', realpath(dirname($dstfile)));
while (isset($srcdir[0]) && isset($dstdir[0]) && $srcdir[0] === $dstdir[
0]) {
array_shift($srcdir);
array_shift($dstdir);
}
if (count($dstdir) != 0) $dstdir[] = '';
$relative = str_repeat('../', count($srcdir)).implode('/', $dstdir);
return $relative;
}
?>
<link rel="stylesheet" href="<?= relativepath($_SERVER[SCRIPT_FILENAME], __FILE__) ?>style.css" type="text/css">
---ここまで---

こんな感じでしょうか。
    • good
    • 0

> <link rel="stylesheet" href="<?= dirname(__FILE__) ?>/style.css" type="text/css">



使い方自体は正しいので、具体的にうまくいかないとは どういった状態でしょうか?

dirname(__FILE__) は そのファイル自身の絶対パスを返しますので、どこからincludeされても、ご希望通りの動きをしているはずです。

何通りか試してみて、HTMLのソースを見てみてはいかがでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!