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 le domaine actuel PHP, 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 la version 5.2 de PHP.
$_SERVER['HTTP_HOST']
. Si les sitesone.com
ettwo.com
"redirigent" en utilisant un cadre (i), la page elle-même provient toujours de myserver.uk.com, donc vous n'obtiendrez pas le vrai domaine. À quoi sert la source HTMLone.com
?Réponses:
Essayez d'utiliser ceci:
$_SERVER['SERVER_NAME']
Ou analyser
la source
HTTP_X_ORIGINAL_HOST
peut être modifié par l'utilisateur et ne peut pas faire confiance. Ce n'est peut-être pas toujours un problème, mais c'est quelque chose dont il faut être conscient.La meilleure utilisation serait
Et il peut être utilisé comme ceci:
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 mis en surbrillance qui s'arrête directement après l'exécution. Comme j'oublie parfois lequel utiliser moi-même - je pense que cela peut être astucieux.
la source
L'utilisation de
$_SERVER['HTTP_HOST']
me (sous-domaine.) Maindomain.extension. Cela me semble être la solution la plus simple.Si vous «redirigez» réellement via un iFrame, vous pouvez ajouter un paramètre GET qui indique le domaine.
Et puis vous pouvez définir une variable de session qui persiste ces données dans toute votre application.
la source
Le seul moyen sûr de le faire
Toutes les autres réponses de cette page ont des implications en matière de sécurité dont vous devez être conscient.
La plupart des frameworks s'occupent de stocker le domaine pour vous, vous voudrez donc consulter la documentation de votre framework particulier. Si vous n'utilisez pas de framework, envisagez de stocker le domaine dans l'un des endroits suivants:
+ ------------------------------------------------- --- + ----------------------------------- +
| Méthodes sécurisées de stockage du domaine | Utilisé par |
+ ------------------------------------------------- --- + ----------------------------------- +
| Un fichier de configuration | Joomla, Drupal / Symfony |
| La base de données | WordPress |
| Une variable environnementale | Laravel |
| Un registre de services | DNS Kubernetes |
+ ------------------------------------------------- --- + ----------------------------------- +
Vous pouvez utiliser les éléments suivants ... mais ils ne sont pas sécurisés
Les pirates peuvent faire en sorte que ces variables affichent le domaine de leur choix. Cela peut entraîner un empoisonnement du cache et des attaques de phishing à peine perceptibles.
Cela obtient le domaine à partir des en-têtes de requête qui sont ouverts à la manipulation par les pirates . Même avec:
Celui-ci peut être amélioré si le paramètre Apache usecanonicalname est désactivé; dans ce cas,
$_SERVER['SERVER_NAME']
il ne sera plus autorisé à être rempli avec des valeurs arbitraires et sera sécurisé. Cependant, ce n'est pas le cas par défaut et n'est pas courant dans une configuration.Dans les systèmes populaires
Voici comment vous pouvez obtenir le domaine actuel dans les frameworks / systèmes suivants:
WordPress
Si vous construisez une URL dans WordPress, utilisez simplement home_url ou site_url , ou l'une des autres fonctions URL .
Laravel
La
request()->getHost
fonction est héritée de Symfony et est sécurisée depuis la mise à jour de la CVE-2013-4752 2013 .Drupal
Le programme d'installation ne prend pas encore soin de rendre cela sécurisé ( problème # 2404259 ). Mais dans Drupal 8, il existe une documentation que vous pouvez suivre dans Paramètres d'hôte de confiance pour sécuriser votre installation Drupal, après quoi les éléments suivants peuvent être utilisés:
Autres cadres
N'hésitez pas à modifier cette réponse pour inclure comment obtenir le domaine actuel dans votre cadre préféré. Ce faisant, veuillez inclure un lien vers le code source pertinent ou vers tout autre élément qui m'aiderait à vérifier que le framework fait les choses en toute sécurité.
Addenda
Exemples d'exploitation:
Un empoisonnement du cache peut se produire si un botnet demande en permanence une page en utilisant le mauvais en-tête d'hôtes. Le code HTML résultant inclura alors des liens vers le site Web des attaquants où ils peuvent hameçonner vos utilisateurs. Au début, les liens malveillants ne seront renvoyés qu'au pirate, mais si le pirate fait suffisamment de requêtes, la version malveillante de la page se retrouvera dans votre cache où elle sera distribuée à d'autres utilisateurs.
Une attaque de phishing peut se produire si vous stockez des liens dans la base de données en fonction de l'en-tête hosts. Par exemple, supposons que vous stockiez l'URL absolue des profils d'un utilisateur sur un forum. En utilisant le mauvais en-tête, un pirate informatique peut amener quiconque clique sur le lien de son profil à se voir envoyer un site de phishing.
Un empoisonnement de réinitialisation de mot de passe peut se produire si un pirate informatique utilise un en-tête d'hôtes malveillants lorsqu'il remplit le formulaire de réinitialisation de mot de passe pour un autre utilisateur. Cet utilisateur recevra alors un e-mail contenant un lien de réinitialisation de mot de passe menant à un site de phishing.
Voici d' autres exemples malveillants
Mises en garde et remarques supplémentaires:
$_SERVER['SERVER_NAME']
est rempli avec le même en-tête$_SERVER['HTTP_HOST']
que celui utilisé de toute façon (plus le port). Il s'agit de la configuration par défaut d'Apache. Si vous ou devops activez cela, alors tout va bien - ish - mais voulez-vous vraiment compter sur une équipe distincte, ou vous-même trois ans dans le futur, pour conserver ce qui semble être une configuration mineure à un non -valeur par défaut? Même si cela sécurise les choses, je vous déconseille de me fier à cette configuration.$_SERVER['SERVER_NAME']
ne renverra pas le domaine actuel, mais renverra la valeur de la directive serverName.Little Rant:
Cette question a reçu des centaines de milliers de vues sans une seule mention des problèmes de sécurité à portée de main! Cela ne devrait pas être le cas, mais ce n'est pas parce qu'une réponse Stack Overflow est populaire, cela ne signifie pas qu'elle est sécurisée.
la source
$urlparts['path']
n'est pas défini s'il est installé dans le répertoire racine du domaine. Else$urlparts['path']
renvoie le sous-répertoire.Essayez
$_SERVER['SERVER_NAME']
.Astuces: 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 ne pensons jamais.la source
Je sais que ce n'est peut-être pas entièrement sur le sujet, mais d'après mon expérience, je trouve utile de stocker le WWW-ness de l'URL actuelle dans une variable.
Edit: En outre, veuillez consulter mon commentaire ci-dessous, pour voir à quoi cela aboutit.
Ceci est important pour déterminer s'il faut distribuer les appels Ajax avec "www" ou sans:
Lors de l'envoi d'un appel Ajax, le nom de domaine doit correspondre à celui de dans la barre d'adresse du navigateur, sinon vous aurez Uncaught SecurityError dans la console.
J'ai donc proposé cette solution pour résoudre le problème:
Ensuite, selon que $ WWW est vrai ou faux, exécutez l'appel Ajax approprié.
Je sais que cela peut sembler trivial, mais c'est un problème tellement courant qu'il est facile de trébucher.
la source
window.location
. En PHP, vous avezSERVER_NAME
.Tout le monde utilise la
parse_url
fonction, mais parfois l'utilisateur peut transmettre l'argumet dans un format différent.Pour résoudre ce problème, j'ai créé la fonction. Regarde ça:
Passez simplement l'URL et obtenez le domaine.
Par exemple,
retournera le résultat sera
Et dans certaines situations:
Et il reviendra également
stackoverflow.com
.la source
// pour obtenir le domaine
// domaine avec protocole
// protocole, domaine, queryString total ** Comme le $ _SERVER ['SERVER_NAME'] n'est pas fiable pour l'hébergement multi-domaines!
la source
Essayez simplement:
la source