PHPを動かしているサーバーのドメイン名を取得したい・・・
こういうことって結構ありませんか?
僕自身はXAMPP環境と本番環境で処理を切り替えたいみたいな事情があって、そういう時にドメイン名の取得が必要になる場面があります。
ということでPHPでドメイン名を取得する色々な方法とコード例をまとめてみました。
このページの目次
方法1.$_SERVER['HTTP_HOST'] を使うやり方
まず1つめはサーバー変数の HTTP_HOST から取得するという方法
この変数は公式リファレンスによると、次の値が返ってくると説明されています。
現在のリクエストに Host: ヘッダが もしあればその内容。
どうやらヘッダー情報を調べ、 Host: ドメイン名 の値を返してくれる模様。ただ「もしあれば」と書いてあるので、ヘッダーがない場合は正しいものが取得できないみたいですね・・・
この HTTP_HOST を使ったドメイン名取得のコード例を書くなら次の通り
1 2 3 |
/// ドメイン名を取得して出力 $domain = $_SERVER['HTTP_HOST']; echo "ドメイン名 : $domain"; |
そして次がこのコードの出力例
1 |
ドメイン名 : example.com |
この方法が一番簡単な気がします。
ただヘッダーがない場合や、偽装されてる場合など、想定外のヘッダーだった場合は何かしらの対策が必要かも(そこらへんが分からない・・・)
ちなみにCronからスクリプト実行していると、この値は参照できなくなります。
▼参照できない理由と対処法
上の記事でも書いたみたいに、
Cronからドメインとかドキュメントルートを取得したいなら一工夫必要です。
方法2.$_SERVER['SERVER_NAME'] で取得
お次の方法はまたまたサーバー変数を使ったやり方
PHP公式リファレンスから引用すると、 $_SERVER['SERVER_NAME'] を使ってもドメイン名が取得できるみたいです。
現在のスクリプトが実行されているサーバーのホスト名です。 スクリプトがバーチャルホスト上で実行されている場合は そのバーチャルホスト名となります。
この説明を見ると「スクリプトが実行されているサーバーのホスト名」と書いてあります。
なのでヘッダー情報に依存しない正しいドメイン名を取得したい、という場合はこっちを使う方がいいのかもしれませんね。
この SERVER_NAME を使ってドメイン名出力するコード例は次の通り
1 2 3 |
/// ドメイン名を取得して出力 $domain = $_SERVER['SERVER_NAME']; echo "ドメイン名 : $domain"; |
そして次が上コードの出力例
1 |
ドメイン名 : example.com |
$_SERVER['HTTP_HOST'] の場合はヘッダー情報そのものが返ってくるのに対し、こっちは純粋なドメイン名が返されます。
方法3.apache_request_headers関数から抜き出す
最後は apache_request_headers 関数からドメイン名だけを抜き出す、という方法
この関数はヘッダー情報を連想配列形式で返してくれる関数です。
例えば次みたいなコードを実行したとしましょう。
1 2 3 4 |
$headers = apache_request_headers(); echo '<pre>'; var_export($headers); echo '</pre>'; |
そうすると画面に出力されるのは次のような内容
1 2 3 4 5 6 7 8 9 10 |
array ( 'Host' => 'example.com', 'Connection' => 'keep-alive', 'Cache-Control' => 'max-age=0', 'Upgrade-Insecure-Requests' => '1', 'User-Agent' => 'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36', 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Accept-Encoding' => 'gzip, deflate, br', 'Accept-Language' => 'en-US,en;q=0.9,ja;q=0.8', ) |
ハイライトした2行目をみてください。 Host というキー名があります。
この Host の値を調べることでドメイン名だけを抜き出すことが可能です。
実際に apache_request_headers を使ったドメイン名出力のコード例は次の通り
1 2 3 4 5 6 7 8 |
$headers = apache_request_headers(); $domain = ''; foreach ( $headers as $header => $value ) { if( $header == 'host' ) { $domain = $value; } } echo "ドメイン名 : $domain"; |
そして次が上コードの出力結果
1 |
ドメイン名 : example.com |
このコードは最初に紹介した $_SERVER['HTTP_HOST'] と同じ値が返ってくるだけです。なので、純粋にドメイン名だけ知りたい、という場合は遠回りな方法かも
でも、他のヘッダー情報も合わせて知りたい場合などは使えるかもしれません。
ここまでのまとめ
もう一度ドメイン名の取得方法をまとめると次の通り
- サーバー変数の HTTP_HOST を調べる
ヘッダーに含まれるホスト名は $_SERVER['HTTP_HOST'] という変数に格納されている。それを調べればドメイン名が取得可能(ただし余計な情報がくっついてくる可能性あり)
- サーバー変数の SERVER_NAME を調べる
スクリプトが実行されているホスト名は $_SERVER['SERVER_NAME'] という変数から参照可能。ドメイン名を取得する方法としては一番確実かも
- ヘッダー情報からドメイン名だけ取得
送信されたヘッダー情報全ては apache_request_headers 関数から取得可能。ドメイン名以外に調べたい情報があるときに使えそう
余計な情報を含まない正確なドメイン名を知りたい場合は $_SERVER['SERVER_NAME'] を使った方がいいと思います。
以上、PHPでドメイン名を調べる方法についてのまとめでした。