からルート DNS エントリを取得するにはどうすればよいでしょう$_SERVER['HTTP_HOST']
か?
入力:
example.co.uk
www.example.com
blog.example.com
forum.example.co.uk
出力:
example.co.uk
example.com
example.com
example.co.uk
編集: ルックアップ リストが非常に長い
注: コメントで指摘されているように、この方法は実際にはすべての場合に機能するとは限りません。この理由は、一部のトップレベル ドメインは IP アドレスに解決されますが、ほとんどのドメインは IP アドレスに解決されないためです。したがって、与えられた名前が IP アドレスを持っているかどうかを確認するだけでは、その名前がトップレベル ドメイン名であるか疑似トップレベル ドメイン名であるかを検出することはできません。残念ながら、これはおそらく唯一の解決策はルックアップ リストであることを意味します.
繰り返しますが、以下のコードに依存しないでください。教育目的のためだけにここに残します。
ルックアップ リストを使用せずにこれを行う方法があります。リストは信頼できないか不完全である可能性がありますが、この方法は動作することが保証されています。
<?php
function get_domain($url) {
$dots = substr_count($url, '.');
$domain = '';
for ($end_pieces = $dots; $end_pieces > 0; $end_pieces--) {
$test_domain = end(explode('.', $url, $end_pieces));
if (dns_check_record($test_domain, 'A')) {
$domain = $test_domain;
break;
}
}
return $domain;
}
$my_domain = get_domain('www.robknight.org.uk');
echo $my_domain;
?>
この場合、「robknight.org.uk」が出力されます。.com、.edu、.com.au、.ly、または操作しているその他のトップレベル ドメインでも同様に機能します。
適切なドメイン名から始めて、実行可能なドメイン名であると思われる最初のものに対して DNS チェックを実行することで機能します。上記の例では、「org.uk」で始まりますが、これが実際のドメイン名ではなく、ccTLD であることがわかります。次に、有効な「robknight.org.uk」をチェックし、それを返します。ドメイン名がたとえば「www.php.net」であった場合、有効なドメイン名である「php.net」をチェックすることから開始され、ループせずにすぐに返されます。また、有効なドメイン名が見つからない場合は、空の文字列 ('') が返されることにも注意してください。
このコードは、DNS ルックアップに時間がかかるため、短時間で多数のドメイン名を処理するのには適していない可能性がありますが、単一のルックアップやタイム クリティカルではないコードにはまったく問題ありません。
それは少し定義が悪いと思います。
A レコードを返さない親レコードが見つかるまで、各親レコードの DNS ルックアップを試すことができます。
ご存じのように、TLD のみを使用する国 (例: .tv、.us) もあれば、国の TLD を細分化する国 (例: uk) もあります。
理想的には、承認された TLD のルックアップ リスト (それほど長くはありません) が必要です。分割されている場合は、各分割の TLD (たとえば、「.uk」ではなく「.co.uk」) が必要です。これにより、(右から)どの「ドット」を保持するかがわかります。次に、そのドットの左に 1 つのドットを移動し (見つかった場合)、その前のすべてを切り刻みます。
ルックアップ リストがなければ、サブディビジョン (.co など) が国 (2 文字の TLD を持つ) のみを対象としており、AFAIK 自体が 3 文字を超えることはなく、常に文字であるという事実を利用できます。正規表現パターンでそれらを認識します。
編集:気にしないでください。パブリック サフィックスの実際のリストは、はるかに複雑です。ルックアップ テーブルを使用して接尾辞が何であるかを把握し、前のドットに戻り、左にトリミングする必要があります。正規表現は、ここでは不十分なソリューションです。代わりに、サフィックスのリストをディクショナリに保存してから、ドメイン名に対してテストし、一致するまで左からドット部分を一度に 1 つずつ切り取り、切り取った部分を元に戻します。
/[^\.]+\.[escaped|list|of|domains]$/
私はそれがうまくいくと思います。