web-dev-qa-db-fra.com

Obtenir le domaine actuel

J'ai mon site sur le serveur 

http://www.myserver.uk.com

Pour cela j'ai deux domaines:

http://one.com

et 

http://two.com

je voudrais obtenir avec PHP le domaine actuel, mais si j'utilise $_SERVER['HTTP_Host'] alors ceci me montre 

myserver.uk.com

au lieu de:

one.com or two.com

Comment puis-je obtenir le domaine, pas le nom du serveur? J'ai PHP version 5.2

108
Tony Evyght

essayez d'utiliser ceci: $_SERVER['SERVER_NAME']

ou analyser 

$_SERVER['REQUEST_URI']

MODIFIER:

Apache_request_headers ()

147
onehalf

Le meilleur usage serait 

echo $_SERVER['HTTP_Host'];

Et peut être utilisé comme ça

if(strpos( $_SERVER['HTTP_Host'], 'banana.com') !== false){
    echo "Yes this is indeed the banana.com domain";
}

Ce code ci-dessous est un bon moyen de voir toutes les variables de $ _SERVER dans une sortie HTML structurée avec vos mots-clés en surbrillance, qui s'arrête immédiatement après l'exécution. Puisque j'oublie parfois lequel utiliser, je pense que cela peut être chouette. 

<?php 
// change banana.com to the domain you were looking for.. 
$wordToHighlight= "banana.com";
$serverVarHighlighted = str_replace( $wordToHighlight, '<span style=\'background-color:#883399; color: #FFFFFF;\'>'. $wordToHighlight .'</span>',  $_SERVER );
echo "<pre>";
print_r( $serverVarHighlighted );
echo "</pre>";
exit();
?>
46

Utiliser $_SERVER['HTTP_Host'] me donne (sous-domaine.) Maindomain.extension. Cela me semble être la solution la plus simple.

Edit: si vous êtes en train de "rediriger" via un iFrame, vous pouvez ajouter un paramètre get qui indique le domaine.

<iframe src="myserver.uk.com?domain=one.com"/>

Vous pouvez ensuite définir une variable de session qui conserve ces données dans toute votre application.

39
Raz0rwire

Je ne sais pas comment cette réponse a été vue des centaines de milliers de fois sans une seule mention des problèmes de sécurité.

La mauvaise direction:

$_SERVER['HTTP_Host']

Cela obtient le domaine à partir des en-têtes de requête, qui est ouvert à la manipulation par des pirates , et peut conduire à un empoisonnement du cache.

$_SERVER['SERVER_NAME']

Le paramètre par défaut d'Apache a usecanonicalname désactivé, qui remplit $_SERVER['SERVER_NAME'] avec le même en-tête que $_SERVER['HTTP_Host'] l'aurait utilisé de toute façon (plus le port). Voici quelques exemples malveillants . Si usecanonicalname est activé, la sécurité est meilleure, mais je ne sais pas si ce type de configuration fonctionne dans la plupart des environnements.

Mises en garde:

  • Si serverName ne peut pas être résolu, la commande hostname du système d'exploitation est utilisée à sa place [source] .
  • Redhat active par défaut le canal utilisateur [ source ].
  • Si l'en-tête de l'hôte est omis, le serveur se comportera comme si on utilisait la même méthode Était sur [source] .

La bonne manière:

La seule méthode sécurisée garantie est de stocker le domaine où vous pouvez accéder.

De nombreux frameworks se chargent déjà de le faire pour vous, alors consultez la documentation de votre framework particulier. Si vous n'utilisez pas de cadre, l'une des méthodes suivantes fonctionnera:

 + -------------------------------------------------- + ------------------------ + 
 | Méthodes sécurisées de stockage du domaine actuel | Par défaut/Recommandé dans | 
 + --------------------------------------------- ----- + ------------------------ + 
 | Fichier de configuration | Joomla, Drupal/Symfony | 
 | Base de données | WordPress | 
 | Variable environnementale | Laravel | 
 | Registre de service | Kubernetes DNS | 
 + ----------------------------------------------- --- + ------------------------ + 

Pour les utilisateurs de WordPress:

Si vous utilisez WordPress, vous pouvez obtenir le domaine en toute sécurité de la manière suivante:

$urlparts = parse_url(home_url());
$domain = $urlparts['Host'];

(Mais si vous construisez une URL dans WordPress, utilisez simplement home_url ou site_url , ou n’importe laquelle des autres fonctions URL .)


7
Mr. Me

Essayez $_SERVER['SERVER_NAME']. Conseils: Créez un fichier PHP qui appelle la fonction phpinfo() et consultez la section "Variables PHP". Il y a un tas de variables utiles auxquelles nous n'avions jamais pensé.

6
flowfree

Réponse tardive, mais la voici:

$currentDomain = preg_replace('/www\./i', '', $_SERVER['SERVER_NAME']);

Cela vous donnera un nom de domaine propre, sans www

4
Pedro Lobito

Je sais que ce n'est peut-être pas tout à fait sur le sujet, mais d'après mon expérience, je trouve utile de stocker WWW-ness de l'URL actuelle dans une variable.

Edit: En outre, s'il vous plaît voir mon commentaire ci-dessous, pour voir ce que cela veut dire.

Ceci est important pour déterminer si les appels Ajax doivent être envoyés avec "www" ou sans:

$.ajax("url" : "www.site.com/script.php", ...

$.ajax("url" : "site.com/script.php", ...

Lors de l'envoi d'un appel Ajax, le nom de domaine doit correspondre à celui de la barre d'adresse du navigateur, sinon vous aurez la console Uncaught SecurityError in.

J'ai donc proposé cette solution pour résoudre le problème:

<?php
    substr($_SERVER['SERVER_NAME'], 0, 3) == "www" ? $WWW = true : $WWW = false;

    if ($WWW) {
        /* We have www.example.com */
    } else {
        /* We have example.com */
    }
?>

Ensuite, selon que $ WWW est true ou false, exécutez le bon appel Ajax.

Je sais que cela peut paraître trivial, mais c’est un problème si commun qu’il est facile de trébucher. 

3
InfiniteStack

désolé Pour la réponse tardive, tout le monde utilise la fonction parse_url mais parfois, l'utilisateur peut passer l'argumet dans un format différent

afin de résoudre ce problème que j'ai créé la vérification finale vérifier ceci

function fixDomainName($url='')
    {
        $strToLower = strtolower(trim($url));
        $httpPregReplace = preg_replace('/^http:\/\//i', '', $strToLower);
        $httpsPregReplace = preg_replace('/^https:\/\//i', '', $httpPregReplace);
        $wwwPregReplace = preg_replace('/^www\./i', '', $httpsPregReplace);
        $explodeToArray = explode('/', $wwwPregReplace);
        $finalDomainName = trim($explodeToArray[0]);
        return $finalDomainName;
    }

il suffit de passer l'URL et d'obtenir le domaine Par exemple 

echo fixDomainName('https://stackoverflow.com');

retournera le résultat sera

stackoverflow.com

et dans certaines situations 

echo fixDomainName('stackoverflow.com/questions/id/slug');

et il retournera aussi stackoverflow.com

J'espère que ça aide

0
Manojkiran.A
$_SERVER['HTTP_Host'] 

// pour obtenir le domaine

$protocol=strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === FALSE ? 'http' : 'https';
$domainLink=$protocol.'://'.$_SERVER['HTTP_Host'];

// domaine avec protocole

$url=$protocol.'://'.$_SERVER['HTTP_Host'].'?'.$_SERVER['QUERY_STRING'];

// protocole, domaine, total de queryString ** Comme le $ _SERVER ['SERVER_NAME'] n'est pas fiable pour l'hébergement multi-domaines!

0
Sarkar