php - htaccess - como quitar www
¿Cómo se elimina el nombre de dominio de una URL en php? (7)
Aquí hay un par de funciones simples para obtener el dominio raíz (example.com) de un dominio normal o largo (test.sub.domain.com) o url (http://www.example.com).
/**
* Get root domain from full domain
* @param string $domain
*/
public function getRootDomain($domain)
{
$domain = explode(''.'', $domain);
$tld = array_pop($domain);
$name = array_pop($domain);
$domain = "$name.$tld";
return $domain;
}
/**
* Get domain name from url
* @param string $url
*/
public function getDomainFromUrl($url)
{
$domain = parse_url($url, PHP_URL_HOST);
$domain = $this->getRootDomain($domain);
return $domain;
}
Estoy buscando un método (o función) para quitar la parte domain.ext de cualquier URL que se alimenta en la función. La extensión de dominio puede ser cualquier cosa (.com, .co.uk, .nl, .whatever), y la URL que se ingresa puede ser cualquier cosa desde http://www.domain.com hasta www.domain.com/path /script.php?=whatever
¿Cuál es la mejor manera de hacer esto?
Puede usar parse_url () para hacer esto:
$url = ''http://www.example.com'';
$domain = parse_url($url, PHP_URL_HOST);
En este ejemplo $ domain debe contener example.com.
También puede escribir una expresión regular para obtener exactamente lo que desea.
Aquí está mi intento de hacerlo:
$pattern = ''//w+/..{2,3}(?:/..{2,3})?(?:$|(?=//))/i'';
$url = ''http://www.example.com/foo/bar?hat=bowler&accessory=cane'';
if (preg_match($pattern, $url, $matches) === 1) {
echo $matches[0];
}
El resultado es:
example.com
Este patrón también toma en consideración dominios tales como ''example.com.au''.
Nota: no he consultado el RFC relevante.
Pasé algún tiempo pensando si tiene sentido usar una expresión regular para esto, pero al final creo que no.
La expresión regular de firstresponder estuvo a punto de convencerme de que era la mejor manera, pero no funcionó en nada que faltase en una barra inclinada (por ejemplo, http://example.com ). Lo arreglé con lo siguiente: ''//w+/..{2,3}(?:/..{2,3})?(?=[///W])/i''
, pero luego me di cuenta que coincide dos veces para direcciones URL como '' http://example.com/index.htm ''. Oops. Eso no sería tan malo (solo use el primero), pero también coincide dos veces en algo como esto: '' http://abc.ed.fg.hij.kl.mn/ '', y el primer partido no es '' t el correcto. :(
Un compañero de trabajo sugirió simplemente obtener el host (a través de parse_url()
), y luego simplemente tomar los últimos dos o tres bits de la matriz ( split()
en ''.'') Los dos o tres se basarían en una lista de dominios, como ''co.uk'', etc. Hacer esa lista se convierte en la parte difícil.
Resolvió esto ...
Digamos que estamos llamando a dev.mysite.com y queremos extraer ''mysite.com''
$requestedServerName = $_SERVER[''SERVER_NAME'']; // = dev.mysite.com
$thisSite = explode(''.'', $requestedServerName); // site name now an array
array_shift($thisSite); //chop off the first array entry eg ''dev''
$thisSite = join(''.'', $thisSite); //join it back together with dots ;)
echo $thisSite; //outputs ''mysite.com''
Funciona con mysite.co.uk también, así que debería funcionar en todas partes :)
parse_url convierte una URL en una matriz asociativa:
php > $foo = "http://www.example.com/foo/bar?hat=bowler&accessory=cane";
php > $blah = parse_url($foo);
php > print_r($blah);
Array
(
[scheme] => http
[host] => www.example.com
[path] => /foo/bar
[query] => hat=bowler&accessory=cane
)
Solo hay una forma correcta de extraer partes de dominio, es usar Lista de sufijos públicos (base de datos de TLD). Recomiendo el paquete TLDExtract , aquí está el código de muestra:
$extract = new LayerShifter/TLDExtract/Extract();
$result = $extract->parse(''www.domain.com/path/script.php?=whatever'');
$result->getSubdomain(); // will return (string) ''www''
$result->getHostname(); // will return (string) ''domain''
$result->getSuffix(); // will return (string) ''com''