現在のドメインを取得


140

サーバーにサイトがあります

http://www.myserver.uk.com

このために私は2つのドメインを持っています、

http://one.com

そして

http://two.com

PHPの現在のドメインを取得したいのですが、使用すると$_SERVER['HTTP_HOST']、これが表示されます

myserver.uk.com

の代わりに:

one.com or two.com

サーバー名ではなくドメインを取得するにはどうすればよいですか?

PHPバージョン5.2を使用しています。


プライマリURlのみを取得できます。これら3つのうち、どれがプライマリですか。
Code Spy

2
2つのドメインがどのようにリクエストをサーバーに「リダイレクト」するのでしょうか?
xiaofeng.li 2012年

1
@infgeoaxおそらくフレーム...
CodeCaster

プライマリはmyserver.uk.comです。現在のドメイン名を取得するにはどうすればよいですか?アドレスone.comのサイトを開いた場合、myserver.uk.comではなくone.comを取得したい
Tony Evyght

@TonyEvyghtそれがinfgeoaxのポイントであり、私が作成しようとすると、接続しているホスト名をで取得する必要があります$_SERVER['HTTP_HOST']。サイトがone.comtwo.com(i)フレームを使用して「リダイレクト」している場合、ページ自体は引き続きmyserver.uk.comから取得されるため、実際のドメインを取得できません。のHTMLソースはone.com何ですか?
CodeCaster

回答:


175

これを使ってみてください: $_SERVER['SERVER_NAME']

または解析する

$_SERVER['REQUEST_URI']

apache_request_headers()


23
-1:この答えだけでは、私が見ているさまざまな提案が何をしているのか正確にはわかりません。確かに、これは私が引き続き検討するポイントを与えますが、それ自体は本当に良い答えではありません...
Jasper

4
ちょうどますprint_r(は、apache_request_headers())と、あなたはすべての:)理解します
onehalfが

2
@SarahLewis HTTP_X_ORIGINAL_HOSTはユーザーが変更でき、信頼できません。これは常に問題になるとは限りませんが、注意する必要があります。
wp-overwatch.com

64

最良の用途は

echo $_SERVER['HTTP_HOST'];

そしてそれはこのように使用できます:

if (strpos($_SERVER['HTTP_HOST'], 'banana.com') !== false) {
    echo "Yes this is indeed the banana.com domain";
}

以下のこのコードは、構造化されたHTML出力で$ _SERVER内のすべての変数を確認し、実行後に直接停止するキーワードを強調表示するのに適しています。どれを使うか忘れることがあるので、これは気の利いたことだと思います。

<?php
    // Change banana.com to the domain you were looking for..
    $wordToHighlight = "banana.com";
    $serverVarHighlighted = str_replace( $wordToHighlight, '<span style=\'background-color:#883399; color: #FFFFFF;\'>'. $wordToHighlight .'</span>',  $_SERVER );
    echo "<pre>";
    print_r($serverVarHighlighted);
    echo "</pre>";
    exit();
?>

39

使用$_SERVER['HTTP_HOST']すると、(サブドメイン)メインドメイン。拡張子が取得されます。それは私にとって最も簡単な解決策のようです。

実際にiFrameを介して「リダイレクト」している場合は、ドメインを示すGETパラメータを追加できます。

<iframe src="myserver.uk.com?domain=one.com"/>

そして、アプリケーション全体でこのデータを保持するセッション変数を設定できます。


1
ほとんどの場合、ポート番号が含まれているので、後で連結する必要はありません。bsdnoobzによって提案されたphpinfoは、正しい解決策を見つけるのに役立ちます。

30

これを行う唯一の安全な方法

このページの他のすべての回答には、注意が必要なセキュリティ上の影響があります。

現在のドメインを取得する唯一の保証された安全な方法 することである𝓪𝓼𝓮𝓬𝓾𝓻𝓮𝓵𝓸𝓬𝓪𝓽𝓲𝓸𝓷𝓲𝓷𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯を𝓲𝓽を𝓼𝓽𝓸𝓻𝓮。

ほとんどのフレームワークはドメインの保存を担当するため、特定のフレームワークのドキュメントを参照する必要があります。フレームワークを使用していない場合は、次の場所のいずれかにドメインを格納することを検討してください。

+ ------------------------------------------------- --- + ----------------------------------- +
 | ドメインを保存する安全な方法| 使用者|
+ ------------------------------------------------- --- + ----------------------------------- +
 | 設定ファイル| Joomla、Drupal / symfony |
 | データベース| ワードプレス|
 | 環境変数| ララヴェル|
 | サービスレジストリ| Kubernetes DNS |
+ ------------------------------------------------- --- + ----------------------------------- +


以下を使用できますが、安全ではありません

ハッカーは、これらの変数に任意のドメインを出力させることができます。これにより、キャッシュポイズニングとほとんど目立たないフィッシング攻撃が発生する可能性があります。

$_SERVER['HTTP_HOST']

これにより、ハッカーによる操作に対して開かれたリクエストヘッダーからドメインが取得されます。と同じ:

$_SERVER['SERVER_NAME']

これは、Apache設定のusecanonicalnameがオフになっている場合に改善できます。その場合$_SERVER['SERVER_NAME']、任意の値を入力することはできなくなり、安全になります。ただし、これはデフォルトではなく、一般的な設定ではありません。


一般的なシステムでは

以下は、以下のフレームワーク/システムで現在のドメインを取得する方法です。

ワードプレス

$urlparts = parse_url(home_url());
$domain = $urlparts['host'];

WordPressでURLを作成する場合は、home_urlまたはsite_url、またはその他のURL関数を使用します

ララヴェル

request()->getHost()

このrequest()->getHost関数はSymfonyから継承されており、2013 CVE-2013-4752にパッチが適用されて以来安全です。

Drupal

インストーラーはまだこれを安全にする処理をしていません(問題#2404259)。ただし、Drupal 8には、信頼できるホストの設定で Drupalインストールを保護するために使用できるドキュメントがあり、その後、以下を使用できます。

\Drupal::request()->getHost();

その他のフレームワーク

この回答を自由に編集して、お気に入りのフレームワークに現在のドメインを取得する方法を含めてください。その際、フレームワークが安全に動作していることを確認するのに役立つ、関連するソースコードまたはその他へのリンクを含めてください。




補遺

悪用の例:

  1. ボットネットが誤ったホストヘッダーを使用してページを継続的にリクエストすると、キャッシュポイズニングが発生する可能性があります。結果のHTMLには、ユーザーをフィッシングできる攻撃者のWebサイトへのリンクが含まれます。最初、悪意のあるリンクはハッカーにのみ返送されますが、ハッカーが十分なリクエストを行うと、ページの悪意のあるバージョンがキャッシュに残り、そこで他のユーザーに配布されます。

  2. ホストヘッダーに基づいてデータベースにリンクを保存すると、フィッシング攻撃が発生する可能性があります。たとえば、フォーラムのユーザープロファイルへの絶対URLを保存するとします。不正なヘッダーを使用することにより、ハッカーは自分のプロファイルリンクをクリックしたユーザーにフィッシングサイトを送信する可能性があります。

  3. ハッカーが別のユーザーのパスワードリセットフォームに入力するときに悪意のあるホストヘッダーを使用すると、パスワードリセット中毒が発生する可能性があります。そのユーザーには、フィッシングサイトにアクセスするためのパスワードリセットリンクを含むメールが送信されます。

  4. ここにいくつかのより悪質な例があります

追加の警告とメモ:

  • usecanonicalnameがオフになっている場合は、とにかく使用され$_SERVER['SERVER_NAME']ていたのと同じヘッダー$_SERVER['HTTP_HOST']がポートに追加されます。これはApacheのデフォルト設定です。あなたまたはdevopsがこれをオンにした場合、大丈夫です-ish-でも、別のチーム、または3年後の自分自身に頼り、マイナーな構成であると思われるものを-デフォルト値?これにより、セキュリティが確保されますが、この設定に依存しないように注意してください。
  • ただし、Redhatはデフォルトで[ source ]のusecanonicalをオンにします。
  • 仮想ホストエントリでserverAliasが使用され、エイリアスドメインが要求された場合$_SERVER['SERVER_NAME']、現在のドメインは返されませんが、serverNameディレクティブの値が返されます。
  • serverNameを解決できない場合は、オペレーティングシステムのホスト名コマンドが代わりに使用されます[ソース]
  • ホストヘッダーが省略されている場合、サーバーはusecanonicalが[source]にあるかのように動作します。
  • 最後に、ローカルサーバーでこれを悪用しようとしたところ、ホストヘッダーを偽装できませんでした。これに対処するためのApacheのアップデートがあったのか、それとも何か間違ったことをしていたのかはわかりません。いずれにしても、このヘッダーは、仮想ホストが使用されていない環境で引き続き悪用される可能性があります。

リトルラント:

     この質問は、当面のセキュリティ問題について1つも言及することなく、何十万もの意見を受け取りました!このようにすべきではありませんが、スタックオーバーフローの回答が人気があるからといって、それが安全であることを意味するわけではありません。




1
home_urlとsite_urlの違いに言及したいと思うかもしれません。wordpress.stackexchange.com/a/50605/13
Volomike

1
ワードプレスユーザーの場合は+1。サブディレクトリにインストールされているかどうかを調べる必要がある場合は有効ですが$urlparts['path']、ドメインのルートディレクトリにインストールされている場合はparse_url key:が設定されていないことに注意してください。そうでなければ$urlparts['path']、サブディレクトリを返します。
Jonas Lundman、2018年

9

お試しください$_SERVER['SERVER_NAME']

ヒント:関数を呼び出すPHPファイルを作成しphpinfo()、「PHP変数」セクションを参照してください。私たちが考えもしない便利な変数がたくさんあります。


$ _SERVERのprint_r-ingと検索をいつでも試すことができます

3

これは完全に問題ではないかもしれませんが、私の経験では、現在のURLのWWW-nessを変数に格納すると便利です。

編集:さらに、これが何をもたらしているかを確認するには、以下の私のコメントを参照してください。

これは、Ajax呼び出しを "www"付きでディスパッチするかどうかを決定するときに重要です。

$.ajax("url" : "www.site.com/script.php", ...

$.ajax("url" : "site.com/script.php", ...

Ajax呼び出しをディスパッチするとき、ドメイン名はブラウザーのアドレスバーのドメイン名と一致する必要があります。一致しない場合、コンソールにUncaught SecurityErrorが表示されます。

そこで私はこの問題に対処するためにこの解決策を思いつきました:

<?php
    substr($_SERVER['SERVER_NAME'], 0, 3) == "www" ? $WWW = true : $WWW = false;

    if ($WWW) {
        /* We have www.example.com */
    } else {
        /* We have example.com */
    }
?>

次に、$ WWWがtrueかfalseかに基づいて、適切なAjax呼び出しを実行します。

これはささいなことのように聞こえるかもしれませんが、これはつまづきやすいような一般的な問題です。


OPがSERVER_NAMEではなく、ドメインを明示的に要求しました。
Sebastian G. Marinescu

確かに、しかし最近では、wwwの問題についても心配する必要があります。
InfiniteStack

どうして?JSでは、を調べることができますwindow.location。PHPではあなたが得たSERVER_NAME
Sebastian G.Marinescu

4
SERVER_NAMEは、「site.com」がアドレスバーに入力されている場合でも「www.site.com」を返します。コード全体でSERVER_NAMEを使用している場合、特にAjax呼び出しを行う場合、必然的にwww / no-wwwのセキュリティ問題に遭遇します。しかし、質問に答えるために、高度なPHPプログラミングでは、サーバーへのHTTP呼び出しを行うコードをPHPが動的に生成する必要がある場合があります。ターゲットURLに含まれていないページに「www」が含まれていると、セキュリティエラーが発生します。
InfiniteStack

わかりました...私はそれについて読みました、そしてあなたは正しいです。だからあなたの答えは誰かに関連しているかもしれません。よくできました:)
Sebastian G.Marinescu

3

誰もがparse_url関数を使用していますが、ユーザーが別の形式で引数を渡すことがあります。

それを修正するために、関数を作成しました。これをチェックしてください:

function fixDomainName($url='')
{
    $strToLower = strtolower(trim($url));
    $httpPregReplace = preg_replace('/^http:\/\//i', '', $strToLower);
    $httpsPregReplace = preg_replace('/^https:\/\//i', '', $httpPregReplace);
    $wwwPregReplace = preg_replace('/^www\./i', '', $httpsPregReplace);
    $explodeToArray = explode('/', $wwwPregReplace);
    $finalDomainName = trim($explodeToArray[0]);
    return $finalDomainName;
}

URLを渡してドメインを取得するだけです。

例えば、

echo fixDomainName('https://stackoverflow.com');

結果を返します

stackoverflow.com

そしてある状況では:

echo fixDomainName('stackoverflow.com/questions/id/slug');

そして、それはまた戻りstackoverflow.comます。


1
$_SERVER['HTTP_HOST'] 

//ドメインを取得する

$protocol=strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === FALSE ? 'http' : 'https';
$domainLink=$protocol.'://'.$_SERVER['HTTP_HOST'];

//プロトコルを含むドメイン

$url=$protocol.'://'.$_SERVER['HTTP_HOST'].'?'.$_SERVER['QUERY_STRING'];

// protocol、domain、queryString total ** $ _ SERVER ['SERVER_NAME']はマルチドメインホスティングでは信頼できないため、


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.