リモート サーバーとローカル サーバーの両方で機能し、ドメイン名を変更する必要がないソリューションを次に示します。
$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';