» Domain Namen ermitteln (in URL bzw Hostnamen)

Mssql_connect () Kann keine Verbindung zum Server mit dem Remotehost vom PHP-Hosting her herstellenNeuen Thread eröffnenNeue Antwort erstellenMySQL Abfrage wie in der Konsole formatiert ausgeben
AutorNachricht
Administrator 

Name: Marc
Geschlecht:
Anmeldedatum: 28.08.2004
Beiträge: 52420
Wohnort: Lohmar


Meine eBay-Auktionen:
08.03.2012, 14:36
zitieren

Es ist gar nicht so einfach eine Domain aus einer URL zu ermitteln, denn es gibt viele URLs, die exakt den selben Aufbau besitzen, aber unterschiedliche Bedeutungen haben:
  • bbc.co.uk
    ist eine Domain
  • www.db.de
    ist eine Subdomain
Man benötigt also zwingend für "co.uk" eine Liste an Hand man abgleicht, nur welche Domainendungen (TLD) gibt es denn alles?

Daher habe ich eine Filter-Funktion realisiert, die sich die Mozilla Public Suffix List zu nutze macht. Diese Liste enthält alle Domainendungen und ist stets aktuell, da sie von so gut wie allen bekannten Browsern genutzt wird:
function tld_list($cache_dir=null) {
// we use "/tmp" if $cache_dir is not set
$cache_dir = isset($cache_dir) ? $cache_dir : sys_get_temp_dir();
$lock_dir = $cache_dir . '/public_suffix_list_lock/';
$list_dir = $cache_dir . '/public_suffix_list/';
// refresh list all 30 days
if (file_exists($list_dir) && @filemtime($list_dir) + 2592000 > time()) {
return $list_dir;
}
// use exclusive lock to avoid race conditions
if (!file_exists($lock_dir) && @mkdir($lock_dir)) {
// read from source
$list = @fopen('https://publicsuffix.org/list/public_suffix_list.dat', 'r');
if ($list) {
// the list is older than 30 days so delete everything first
if (file_exists($list_dir)) {
foreach (glob($list_dir . '*') as $filename) {
unlink($filename);
}
rmdir($list_dir);
}
// now set list directory with new timestamp
mkdir($list_dir);
// read line-by-line to avoid high memory usage
while ($line = fgets($list)) {
// skip comments and empty lines
if ($line[0] == '/' || !$line) {
continue;
}
// remove wildcard
if ($line[0] . $line[1] == '*.') {
$line = substr($line, 2);
}
// remove exclamation mark
if ($line[0] == '!') {
$line = substr($line, 1);
}
// reverse TLD and remove linebreak
$line = implode('.', array_reverse(explode('.', (trim($line)))));
// we split the TLD list to reduce memory usage
touch($list_dir . $line);
}
fclose($list);
}
@rmdir($lock_dir);
}
// repair locks (should never happen)
if (file_exists($lock_dir) && mt_rand(0, 100) == 0 && @filemtime($lock_dir) + 86400 < time()) {
@rmdir($lock_dir);
}
return $list_dir;
}
function get_domain($url=null) {
// obtain location of public suffix list
$tld_dir = tld_list();
// no url = our own host
$url = isset($url) ? $url : $_SERVER['SERVER_NAME'];
// add missing scheme      ftp://            http:// ftps://   https://
$url = !isset($url[5]) || ($url[3] != ':' && $url[4] != ':' && $url[5] != ':') ? 'http://' . $url : $url;
// remove "/path/file.html", "/:80", etc.
$url = parse_url($url, PHP_URL_HOST);
// replace absolute domain name by relative (http://www.dns-sd.org/TrailingDotsInDomainNames.html)
$url = trim($url, '.');
// check if TLD exists
$url = explode('.', $url);
$parts = array_reverse($url);
foreach ($parts as $key => $part) {
$tld = implode('.', $parts);
if (file_exists($tld_dir . $tld)) {
return !$key ? '' : implode('.', array_slice($url, $key - 1));
}
// remove last part
array_pop($parts);
}
return '';
}

Anmerkungen
  • beim Aufruf von
    tld_list()
    wird die Liste alle 30 Tage aktualisiert bzw der Wert
    2592000
    kann entsprechend an die eigenen Bedürfnisse angepasst werden
  • das Laden der Liste dauert einige Sekunden, daher kann es ratsam sein, die Aktualisierung über einen Cronjob oder ein verstecktes Bild durch den separaten Aufruf von
    tld_list()
    auszulösen, um die Ladezeiten der Besucher nicht negativ zu beeinflussen (auch wenn es in 30 Tagen nur einen betrifft). In dem Fall sollte man den Aufruf aus
    get_domain()
    entfernen
  • die Liste wird zeilenweise mit
    fopen()
    eingelesen, so dass man sich keine Sorgen um die Auslastung des Arbeitsspeichers machen muss
  • außerdem speichern wird die Liste lokal nicht in einer großen Datei, sondern jede TLD erzeugt im Cache-Verzeichnis eine neue Datei.
    get_domain()
    prüft dann per
    file_exists()
    ob z.B. das ".com" aus "www.example.com" eine existierende TLD ist. Auch das schont die Auslastung des Arbeitspeichers, denn sonst müsste man eine ~170 kB große Datei mit ~8000 Array-Elementen bei jedem Aufruf laden wie es bei den langsamen Alternativen PHP Domain Parser oder TLDExtract der Fall ist
  • tld_list()
    um die Liste zu laden, wird vorausgesetzt
  • die Liste wird im "tmp/"-Verzeichnis von PHP abgespeichert oder man kann per tld_list('meinCacheVerzeichnis/') ein eigenes Verzeichnis angeben
  • get_domain($url)
    akzeptiert URLs, Hostnamen oder Domains mit und ohne Schema ("http://", "https://", etc.) und gibt die registrierbare Domain zurück
  • get_domain()
    kann auch ohne Parameter aufgerufen werden, dann wird die lokale Server-Adresse ausgelesen, also in unserem Fall "www.programmierer-forum.de"
To-Do
  • die Liste nur bei Änderung eines ETag oder Last-Modified ändern. Leider ist kein ETag vorhanden und Last-Modified war bisher immer häufiger aktualisiert als der feste 30 Tage Intervall
  • es ist möglich, dass die Listen-Quelle publicsuffix.org irgendwann nicht mehr vertrauenswürdig ist. Für den Fall sollte $line eine Verifikation durchführen und die Schleife sollte auch limitiert werden.
  • wir sollten doch lieber überschreiben, statt erst alles zu löschen, falls publicsuffix.org mit einer leeren Datei antwortet
Test-Ergebnisse
$urls = array(
'http://www.example.com',// example.com
'http://subdomain.example.com',// example.com
'http://www.example.uk.com',// example.uk.com
'http://www.example.co.uk',// example.co.uk
'http://www.example.com.ac',// example.com.ac
'http://example.com.ac',// example.com.ac
'http://www.example.accident-prevention.aero',// example.accident-prevention.aero
'http://www.example.sub.ar',// sub.ar
'http://www.congresodelalengua3.ar',// congresodelalengua3.ar
'http://congresodelalengua3.ar',// congresodelalengua3.ar
'http://www.example.pvt.k12.ma.us',// example.pvt.k12.ma.us
'http://www.example.lib.wy.us',// example.lib.wy.us
'com',// empty
'.com',// empty
'http://big.uk.com',// big.uk.com
'uk.com',// empty
'www.uk.com',// www.uk.com
'.uk.com',// empty
'stackoverflow.com',// stackoverflow.com
'.foobarfoo',// empty
'',// empty
false,// empty
' ',// empty
1,// empty
'a',// empty
);

foreach ($urls as $url) {
echo $url . ':' . var_export(get_domain($url), true) . PHP_EOL;
}
echo $_SERVER['SERVER_NAME'] . ':' . var_export(get_domain(), true) . PHP_EOL;



Verfasst am: 04.02.2017, 03:26
zitieren

Ich würde ja gerne mal einen Benchmark-Vergleich mit PHP Domain Parser:
https://github.com/jeremykendall/php-domain-parser

und TLDExtract durchführen:
https://github.com/layershifter/TLDExtract

Allerdings kann man beide nur in Verbindung mit Composer installieren. Allerdings kann ich mir sowieso nicht vorstellen, dass diese "fetten" Klassen schneller sind.

 3x  bearbeitet
pn email
Gast 
04.02.2017, 03:26
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "Domain Namen ermitteln (in URL bzw Hostnamen)" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neuen Thread eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:
Letzter Beitrag
Domainnamen / Hostnamen validieren
Ich hatte hier eine interessante Funktion gefunden, die allerdings wirklich alles genehmigt was als Hostname möglich ist. Also auch "localhost" oder schlicht "a": function is_valid_domain_name&#40;$domain_name&#41; &#123;...
[PHP]von mgutt
2
658
24.03.2015, 22:44
mgutt
Batteriezustand ermitteln!?
Hallo Jungs, hab mal sone frage: Meine Autobatterie ist vor ein paar Tagen entladen, wahrscheinlich durch zuviel musik hören und licht anlassen, wärend der Motor aus ist! So nun hab ich das Auto mit Überbrückungskabeln angekriegt und war damit ca....
von JohnnyB
7
1.563
27.11.2007, 17:48
JohnnyB
CSV Delimiter ermitteln
Die Funktion durchläuft die bekannten Delimiter und gibt als Ergebnis das Zeichen aus, was die meisten Spalten resultierte: function csv_delimiter&#40;$filename&#41; &#123; $delimiters = array&#40;'|', ';',...
[PHP]von mgutt
0
391
16.02.2015, 22:37
mgutt
Windows 8 Key aus Recovery ermitteln?
Kann ich aus einem Recovery den Windows 8 Key ermitteln und damit dann eine neue Installation durchführen? Damals als ich den Notebook gekauft hatte, war Windows 8 vorinstalliert und natürlich keine Installations-DVD dabei. Ich finde auch nirgends einen...
von mgutt
4
137
07.01.2015, 15:53
mgutt
Farbe von Querlenker ermitteln
Hallo, habe mir Focuz Querlenker gekauft nun brauche ich die ganuere Farbe da ich meine anderen Achsteile auch so lackieren will. Könnt mir evtl jemand helfen? Also farbe ist ca Bronze bzw...
von ArTo_1HGEJ2
9
872
02.11.2009, 17:07
silent
Lackfarbe: wie ermitteln ohne Farbcode?
Hallo, ich möchte mir bald einen Type R-Grill in meinen EJ9 einbauen; allerdings ist mein Fahrzeug vom Vorbesitzer, einem wohl bereits ein wenig senilen Rentner, 2 Jahre nach seiner EZ silber umlackiert worden. Jedoch ist dies wohl nicht das...
von MrHighway
9
17.302
26.03.2007, 08:09
STRAUBSTER
IP des Besuchers ermitteln REMOTE_ADDR, HTTP_X_FORWARDED_FOR
Auf Grund eines Tipps kam ich zu diesen Funktionen: http://www.dreamincode.net/code/snippet1745.htm http://www.grantburton.com/tag/http_client_ip/ Die waren mir in Sachen Performance zu schlecht, weshalb ich das gecodet habe: // set ip if...
[PHP]von mgutt
2
25.698
20.06.2009, 18:11
mgutt
Wie kann ich die kleinste Zahl ermitteln?
#include <stdio.h> #include <conio.h> int max(int a, int b) { if (a > b) return (a); else return (b); } int min (int a, int b) { if (a < b) return (a); else return (b); ...
[C]von Torti87
1
892
28.09.2011, 14:05
hugo17
Gewindesteigung bestimmen/messen/ermitteln: Wie?
Hi, wie ermittle ich die Gewindesteigung einer Schraube? Messe ich einfach den Abstand zwischen zwei Gewinden oder wie? Gibts was für Deppen so einer Art "Schraublehre"?...
von mgutt
26
44.802
12.07.2012, 20:21
RS188
Signaturgröße automatisch ermitteln und bei Bedarf ablehnen
Jeder kennt das als Forenbetreiber. Die User hauen große Grafiken in die Signatur oder gar animierte GIFs ohne Ende. Da setzen wir doch glatt einen Riegel vor: // check image size if (stripos($this->value, '[/img') !== false)...
[PHP]von mgutt
0
7.509
20.02.2009, 02:28
mgutt
© 2004 - 2024 www.programmierer-forum.de | Communities | Impressum |