PHPでドメイン名を取得する3つの方法&コード例

PHPを動かしているサーバーのドメイン名を取得したい・・・

こういうことって結構ありませんか?

僕自身はXAMPP環境と本番環境で処理を切り替えたいみたいな事情があって、そういう時にドメイン名の取得が必要になる場面があります。

ということでPHPでドメイン名を取得する色々な方法とコード例をまとめてみました。

方法1.$_SERVER['HTTP_HOST'] を使うやり方

まず1つめはサーバー変数の HTTP_HOST  から取得するという方法

この変数は公式リファレンスによると、次の値が返ってくると説明されています。

現在のリクエストに Host: ヘッダが もしあればその内容。

PHP: $_SERVER - Manual より引用

どうやらヘッダー情報を調べ、 Host: ドメイン名  の値を返してくれる模様。ただ「もしあれば」と書いてあるので、ヘッダーがない場合は正しいものが取得できないみたいですね・・・

 

この HTTP_HOST を使ったドメイン名取得のコード例を書くなら次の通り

そして次がこのコードの出力例

この方法が一番簡単な気がします。

ただヘッダーがない場合や、偽装されてる場合など、想定外のヘッダーだった場合は何かしらの対策が必要かも(そこらへんが分からない・・・)

 

ちなみにCronからスクリプト実行していると、この値は参照できなくなります。

▼参照できない理由と対処法

上の記事でも書いたみたいに、
Cronからドメインとかドキュメントルートを取得したいなら一工夫必要です。

方法2.$_SERVER['SERVER_NAME'] で取得

お次の方法はまたまたサーバー変数を使ったやり方

PHP公式リファレンスから引用すると、 $_SERVER['SERVER_NAME']  を使ってもドメイン名が取得できるみたいです。

現在のスクリプトが実行されているサーバーのホスト名です。 スクリプトがバーチャルホスト上で実行されている場合は そのバーチャルホスト名となります。

PHP: $_SERVER - Manual より引用

この説明を見ると「スクリプトが実行されているサーバーのホスト名」と書いてあります。

なのでヘッダー情報に依存しない正しいドメイン名を取得したい、という場合はこっちを使う方がいいのかもしれませんね。

 

この SERVER_NAME を使ってドメイン名出力するコード例は次の通り

そして次が上コードの出力例

$_SERVER['HTTP_HOST']  の場合はヘッダー情報そのものが返ってくるのに対し、こっちは純粋なドメイン名が返されます。

方法3.apache_request_headers関数から抜き出す

最後は apache_request_headers  関数からドメイン名だけを抜き出す、という方法

この関数はヘッダー情報を連想配列形式で返してくれる関数です。

 

例えば次みたいなコードを実行したとしましょう。

そうすると画面に出力されるのは次のような内容

ハイライトした2行目をみてください。 Host  というキー名があります。

この Host  の値を調べることでドメイン名だけを抜き出すことが可能です。

 

実際に apache_request_headers を使ったドメイン名出力のコード例は次の通り

そして次が上コードの出力結果

このコードは最初に紹介した $_SERVER['HTTP_HOST']  と同じ値が返ってくるだけです。なので、純粋にドメイン名だけ知りたい、という場合は遠回りな方法かも

でも、他のヘッダー情報も合わせて知りたい場合などは使えるかもしれません。

ここまでのまとめ

もう一度ドメイン名の取得方法をまとめると次の通り

  • サーバー変数の HTTP_HOST を調べる
    ヘッダーに含まれるホスト名は $_SERVER['HTTP_HOST']  という変数に格納されている。それを調べればドメイン名が取得可能(ただし余計な情報がくっついてくる可能性あり)
  • サーバー変数の SERVER_NAME を調べる
    スクリプトが実行されているホスト名は $_SERVER['SERVER_NAME']  という変数から参照可能。ドメイン名を取得する方法としては一番確実かも
  • ヘッダー情報からドメイン名だけ取得
    送信されたヘッダー情報全ては apache_request_headers  関数から取得可能。ドメイン名以外に調べたい情報があるときに使えそう

余計な情報を含まない正確なドメイン名を知りたい場合は $_SERVER['SERVER_NAME']  を使った方がいいと思います。

以上、PHPでドメイン名を調べる方法についてのまとめでした。

PHP

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください