web-dev-qa-db-ja.com

現在のドメインを取得

私のサイトはサーバー上にあります

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があります

116
Tony Evyght

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

または解析する

$_SERVER['REQUEST_URI']

編集:

Apache_request_headers()

151
onehalf

最善の使い方は

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();
?>
49

$_SERVER['HTTP_Host']を使用すると、私(サブドメイン)maindomain.extensionが取得されます。私にとって最も簡単な解決策のように思えます。

編集:あなたが実際にiFrameを通して「リダイレクト」しているなら、あなたはドメインを示すgetパラメータを追加することができます。

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

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

39
Raz0rwire

当面のセキュリティ問題についての言及なしに、この回答が何十万もの見解をどのように受け取ったのか私は知りません。

あなたは以下を使うことができますが、それらは安全ではありません

$_SERVER['HTTP_Host']

これはリクエストヘッダーからドメインを取得するもので、これは ハッカーによる操作に対してオープン であり、キャッシュポイズニングを引き起こす可能性があります。

$_SERVER['SERVER_NAME']

デフォルトのApache設定では secanonicalname がオフになっています。これは、$_SERVER['SERVER_NAME']にとにかく(プラスポートを)使用した場合と同じヘッダーを$_SERVER['HTTP_Host']に追加するためのものです。 これはいくつかの悪質な例です 。 usecanonicalnameがオンになっていると、より安全になりますが、そのタイプの設定がほとんどの環境で機能するかどうかはわかりません。

警告:

  • ServerNameを解決できない場合は、代わりにオペレーティングシステムのhostnameコマンドが使用されます [source]
  • Redhatはデフォルトでusecanonicalをオンにします[ source ]。
  • Hostヘッダーが省略された場合、サーバーはusecanonicalがオンになっているかのように動作します [source]

正しい方法

唯一の保証された安全な方法はあなたがアクセスできるどこかにドメイン名を保存することです。

多くのフレームワークがすでにあなたのためにこれをやるようにしているので、あなたの特定のフレームワークのためのドキュメンテーションを調べてください。フレームワークを使用していない場合は、次の方法のいずれかが機能します。

 + -------------------------------------------- -  + ------------------------ + 
 |現在のドメインを保存する安全な方法デフォルト/推奨する場所| 
 + --------------------------------------- ------- + ------------------------ + 
 |設定ファイル| Joomla、Drupal/Symfony | 
 |データベース| WordPress | 
 |環境変数Laravel | 
 |サービスレジストリKubernetes DNS | 
 + ----------------------------------------- ----- + ------------------------ + 

WordPressユーザー向け

WordPressを使用している場合は、次のように安全にドメインを取得できます。

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

(ただし、WordPressでURLを作成している場合は、 home_url または site_url 、あるいは その他のURL関数 を使用してください。)


9
Mr. Me

$_SERVER['SERVER_NAME']を試してください。ヒント:関数phpinfo()を呼び出すPHPファイルを作成し、PHP変数を参照してください。私たちがそこで考えたことがないたくさんの有用な変数があります。

6
flowfree

回答が遅れていますが、ここでは

$currentDomain = preg_replace('/www\./i', '', $_SERVER['SERVER_NAME']);

wwwを付けずに、きれいなドメイン名を指定できます。

4
Pedro Lobito

私はこれが完全には主題ではないかもしれないことを知っている、しかし私の経験では、私は変数に現在のURLのWWW-nessを格納することが役に立つと思う。

編集:さらに、これがどうなっているのかを見るために、下の私のコメントを見てください。

これは、Ajax呼び出しを "www"を使って、または次を付けずにディスパッチするかどうかを決めるときに重要です。

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

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

Ajax呼び出しをディスパッチするとき、ドメイン名はブラウザのアドレスバーのそれと一致しなければなりません、そうでなければ、コンソールにncaught 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呼び出しを実行します。

私はこれが些細に聞こえるかもしれないことを知っています、しかしこれはつまずくことが容易であるそのような一般的な問題です。

3
InfiniteStack

すみません遅い答えのために誰もが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
Manojkiran.A
$_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']はマルチドメインホスティングに対して信頼できないためです!

0
Sarkar