3

dns_get_record($domain) などの関数を使用して、ドメインの有効性を確認しようとしています。問題は、それが有効なドメインでない場合、私がいるサイト IP のドメインの前に追加することです。gethostbyname、dns_get_record などの関数は期待どおりに機能しないため、これに依存することはできません。

ドメインが存在しない場合、これらの関数のいずれかが失敗した結果を返すと思います。そうではありません。「ping」コマンドを使用すると、PHP 関数と同じことが行われることに気付きましたが、「host」コマンドは期待どおりに機能します。

gethostbyname を使用する C プログラムを作成すると、期待どおりに動作します。Python 'socket.gethostbyname' と同じです。どちらも、無効なドメインでのルックアップに失敗します。

PHP関数で何が起こっていますか? 期待どおりに動作せず、無効なドメイン名で失敗するのはなぜですか?

example.com のドメイン名を持つホストで次を使用すると、次のようになります。

dns_get_record('something')

Array
    (
        [0] => Array
            (
                [host] => somthing.example.com
                [type] => A
                [ip] => some ip address
                [class] => IN
                [ttl] => 600
            )

    )

これは私が望むものではありません。バグがある場合は、バグへのリンクをいただければ幸いです。

アップデート:

@Barmarが正しく指摘したように、それはDNSレコードが設定された方法です. PHP がインストールされている自宅のコンピューターで、関数 gethostbyname() とその友人が期待どおりに動作することを発見しました。

これは、DNS がワイルドカードを有効にするように設定されている場合に、ドメインが有効かどうかを確実に確認するにはどうすればよいかという問題を引き起こします。私が見つけた唯一の方法は、コマンド ライン tolls を使用して PHP から呼び出すことでした。私はこのオプションが好きではありませんが、現時点ではこれしかありません。幸運なことに、頻繁に呼び出される操作ではありません。

4

2 に答える 2

6

検索するドメインにピリオドを追加することで、ローカル ドメインの自動検索を無効にすることができます

dns_get_record("something.")
于 2013-04-25T01:06:13.760 に答える
2

これは、ドメインにワイルドカード レコードがあるためです。domain名前のルックアップが失敗すると、ローカル ドメインが追加されて再試行されます ( のまたはsearchオプションに基づいて/etc/resolv.conf)。通常、これは失敗するため、ルックアップ全体が失敗します。ただし、ドメインにワイルドカードがある場合、再試行は成功し、これが結果として返されます。

于 2013-04-23T05:35:54.687 に答える