URLルーティングディレクトリに依存しないWebサイトを維持する方法
-
07-07-2019 - |
質問
URLルーティングを使用するPHP Webサイトを開発しています。サイトをディレクトリに依存しないようにして、 http://site.example.com/から移動できるようにします。 から http://example.com/site/ へ、HTMLのすべてのパスを変更する必要なし。この問題は、CSSファイルや画像など、ルーティングの対象ではないファイルにリンクしているときに発生します。
たとえば、コントローラーindex
のアクションwelcome
のビューにイメージimg/banner.jpg
が含まれていると仮定します。 URLが http://site.example.com/welcome のページがリクエストされた場合、ブラウザは http://site.example.com/img/banner.jpg として画像をリクエストします、これはまったく問題ありません。ただし、URL http://site.example.com/welcome/index、ブラウザは<img src="<?php echo url::base(); ?>img/banner.jpg" />
はディレクトリであると見なし、イメージをとして取得しようとします。 http://site.example.com/welcome/img/banner.jpg 、これは明らかに間違っています。
すでにいくつかのオプションを検討しましたが、それらはすべて私には不完全に見えます:
-
URL書き換えを使用して、( *。css | *。js | ...)または( css / * | js / * | ...)を正しいパスに移動します。
問題:すべての拡張機能は、書き換えルールで名前を付ける必要があります。誰かが新しいファイルタイプ(mp3ファイルなど)を追加しても、それは書き換えられません。
-
php関数を使用して、各相対パスにベースパスを追加します。例:
<=>問題:乱雑に見えます。パスを含む css -および js -ファイルは、PHPで処理する必要があります。
では、Webサイトのディレクトリを独立させるにはどうすればよいですか?私が思いついたものよりも良い/きれいな方法はありますか?
解決
頭に入れることができます
<base href="<?php echo url::base(); ?>" />
これは、ブラウザーがそのパスに関連する非絶対URLを要求することを意味します。 ただし、これがCSSファイルなどに埋め込まれたURLにどのように影響するかはわかりません。これは、CSSファイルで定義されたパスには影響しません。 (moowareに感謝)
他のヒント
<base>
は機能しますが、<a>
タグにも影響することを覚えておく必要があります。この例を考えてみましょう。:
<!-- this page is http://oursite.com/index.html -->
<html>
<head>
<base href="http://static.oursite.com/" />
</head>
<body>
<img src="logo.gif" alt="this is http://static.oursite.com/logo.gif" />
<a href="/login">this links to http://static.oursite.com/login which is not what we wanted. we wanted http://oursite.com/login</a>
</body>
</html>
リンクを作成するためにPHP関数呼び出しを使用する場合、絶対URLを吐き出すことを確認するだけで問題はありません。しかし、あなた(またはあなたのデザイナー)が<img>
タグを手動でコーディングすると、同じ問題が再び発生します。今は<=>の代わりに<=>を使用しています。
編集:上記の段落を追加する必要がありますが、私たちと同じように異なるホスト名から画像を提供することを前提としています。そうでなければ、明らかにそれは問題になりません。
tomhaighには良い点があり、さらに調査する価値があります。
MSDN によると、< a href = "http://msdn.microsoft.com/en-au/library/ms535191(VS.85).aspx" rel = "nofollow noreferrer"> base タグは、スタイルを含むすべての外部ソースに対して機能します。シート、画像など
何かが足りないのかもしれませんが、私(そして他のみんな)がやっていることをやってもいいですか?つまり、すべての画像、CSS、javascriptなどを共通のディレクトリに配置します。例:
/inc/images/
/inc/css/
/inc/javascript/
etc
次に、ベース相対URLでそれらを参照します。例:
<img src="/inc/images/foo.jpg" />
etc
?