5

私は通常、絶対 URL パスを使用した相対 URLの次のリンク方法を使用しています。

<a href="/relative/path/to/document.html">

ただし、絶対 URLを実装します。

<a href="http://example.com/relative/path/to/document.html">

それらを変更することは問題ではありません (HTML ドキュメントでの自動検索と置換)。

しかし、私のローカルホスト(PHP をサポートする) とWeb の両方で動作することを確認するためのベストプラクティスは何ですか? なぜ?


たとえば、PHP インクルードの方法は次のとおりです。

<?php include($_SERVER['DOCUMENT_ROOT']."/relative/path/to/document.html"); ?>

hrefURLにも同じアプローチを採用しますか? 別の PHP 手法の方が優れていますか? 理由を聞いて興味があります。

4

5 に答える 5

6

HTML の href に定義済みの定数または変数を含めることができます。

例えば

<?php
define("LOCAL", "http://localhost");
define("WEB", "http://foo.bar");
$environment = LOCAL; //change to WEB if you're live
?>
<a href="<?php echo $environment; ?>/relative/path/to/document.html">
于 2013-01-17T03:18:17.757 に答える
6

ローカルと Web ホストで同じディレクトリ構造を維持し、可能な限り相対 URI とパスを使用します。絶対 URI を使用する必要がある場合は、絶対 URI をどこかで一度定義し、URI を出力する必要があるときはいつでも定数を使用して、検索と置換を使用して変更を行う必要がないようにします。

<?php
    define('ROOT_URI', 'http://example.com/subdirectory');
?>

<a href='<?php echo ROOT_URI; ?>/relative/path/to/document.html'> document </a>

一度だけ定義する構成ファイルまたはその他のインクルード ファイルがある場合は、より簡単です。

于 2013-01-17T03:10:55.500 に答える
3

それはすべて、コンテンツのホスティングをどのように計画するかによって異なります. PHP をサポートするホスティング会社はたくさんあるので、PHP は悪い選択ではありません。PHP のようなスクリプト言語がなければ、JavaScript を使用するのが最善の策ですが、URL を絶対パスにしようとする理由によっては、目的を達成できない可能性があります。

$_SERVER['DOCUMENT_ROOT'] に依存できる場合とできない場合があるため、構成ファイルを作成することをお勧めします。

言う: config.php

<?php
define("HOST", "http://example.com");
// Whatever else you might need on all files.

次に、それを必要とするすべてのファイルは、これを一番上に置きます

<?php
include_once(dirname(__FILE__)."/config.php");

// Keep in mind this path is relative to current file, so if you are 3 sub-folder keep
// include_once(dirname(__FILE__)."/../../../config.php")
?>

...

<a href=<?php echo HOST;?>/relative/path/to/document.html">...
于 2013-01-17T03:25:12.127 に答える
0

これを行う代わりに、head タグに以下の行を追加できます。これで、ルートに関連するすべての URL を指定できます。今、サーバーにアップロードするか、ローカルホストで作業するとき。ここでURLを変更するだけです。

<base href="http://mydomin.com/" />
于 2014-04-12T20:57:01.703 に答える
0

リモート サーバーとローカル サーバーの両方で機能し、ドメイン名を変更する必要がないソリューションを次に示します。

$protocol = isset($_SERVER["HTTPS"]) ? 'https://' : 'http://';
$url_base = $protocol . $_SERVER['HTTP_HOST'];

これらの 2 行を使用すると、ドメイン名を変更してもコードを変更する必要はなく、HTTP と HTTPS を切り替える場合にもコードを変更する必要はありません。変数名は自由に変更してください。

したがって、リンクのコードは次のようになります。

<a href="<?php echo $url_base; ?>/relative/path/to/document.html">link</a>

セキュリティに関する重要な更新:

ただし、このソリューションにはセキュリティ上のリスクがあります。ここにそれに関する記事があります。

$_SERVER['HTTP_HOST']および$_SERVER['SERVER_NAME']変数は、サイトにアクセスするときに別の Host ヘッダーを送信することで変更できます。

curl -H "Host: notyourdomain.com" http://yoursite.com/

そうすることで、notyourdomain.comを使用した$_SERVER['HTTP_HOST']、または使用する可能性のあるすべての URL。$_SERVER['SERVER_NAME']

これをさらに進めて、攻撃者がパスワード リセット フォームに電子メールを入力し、Host ヘッダーを変更したとします。パスワード リセットの電子メールで、そのサイトに誘導されます。ドメインに注意を払っている場合は問題ありませんが、通常のユーザーはそうではなく、フィッシング攻撃が機能するのはそのためです。

したがって、注意して使用するか、使用を避けてください。

リンクされた記事から複数の環境に対処する方法を次に示します。

複数の環境を扱う場合、 と を使用できますが、使用 $_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME']ているドメインを確認し、正しい URL を手動で設定する場合にのみ使用できます。有効なドメインの配列を使用してシンプルに保つことができます。

$domains = array('domain.com', 'dev.domain.com', 'staging.domain.com', 'localhost');
if (in_array($_SERVER['HTTP_HOST'], $domains)) {
    $domain = $_SERVER['HTTP_HOST'];
}else {
    $domain = 'localhost';
}

少し短くすることもできます。

$domains = array('domain.com', 'dev.domain.com', 'staging.domain.com', 'localhost');
$domain = in_array($_SERVER['HTTP_HOST'], $domains) ? $_SERVER['HTTP_HOST'] : 'localhost';
于 2016-12-01T10:10:00.383 に答える