Ottieni dominio corrente


140

Ho il mio sito sul server

http://www.myserver.uk.com

Per questo ho due domini,

http://one.com

e

http://two.com

Vorrei ottenere con il dominio corrente PHP, ma se lo uso, $_SERVER['HTTP_HOST']questo mi mostra

myserver.uk.com

invece di:

one.com or two.com

Come posso ottenere il dominio, non il nome del server?

Ho PHP versione 5.2.


Puoi ottenere solo URl primario. Qual è il primario tra questi tre?
Codice spia

2
In che modo i tuoi due domini "reindirizzano" le richieste al tuo server?
xiaofeng.li,

1
@infgeoax probabilmente un frame ...
CodeCaster

primario è myserver.uk.com. quindi come posso ottenere il nome di dominio corrente? Se apro il sito con l'indirizzo one.com vorrei ottenere one.com invece di myserver.uk.com
Tony Evyght,

@TonyEvyght questo è il punto infgeoax e provo a fare, dovresti ottenere il nome host con cui ti stai connettendo $_SERVER['HTTP_HOST']. Se i siti one.come two.com"reindirizzano" utilizzando un (i) frame, la pagina stessa proviene ancora da myserver.uk.com, quindi non otterrai il dominio reale. A cosa serve la fonte HTML one.com?
CodeCaster

Risposte:


175

Prova a usare questo: $_SERVER['SERVER_NAME']

O analizzare

$_SERVER['REQUEST_URI']

apache_request_headers ()


23
-1: Con questa sola risposta, non so esattamente quali siano i diversi suggerimenti che sto guardando. Certo, questo mi dà un punto da cui continuare a guardare, ma di per sé questa non è davvero una buona risposta ...
Jasper

4
solo print_r (apache_request_headers ()) e capirai tutti :)
onehalf

2
@SarahLewis HTTP_X_ORIGINAL_HOSTpuò essere modificato dall'utente e non può essere considerato attendibile. Questo potrebbe non essere sempre un problema, ma è qualcosa di cui essere consapevoli.
wp-overwatch.com

64

Il miglior uso sarebbe

echo $_SERVER['HTTP_HOST'];

E può essere usato in questo modo:

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

Questo codice di seguito è un buon modo per vedere tutte le variabili in $ _SERVER in un output HTML strutturato con le parole chiave evidenziate che si arrestano direttamente dopo l'esecuzione. Dal momento che a volte dimentico quale utilizzare me stesso - penso che questo possa essere elegante.

<?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();
?>

39

Usando $_SERVER['HTTP_HOST']mi viene (sottodominio.) Maindomain.extension. Mi sembra la soluzione più semplice.

Se in realtà stai "reindirizzando" attraverso un iFrame, potresti aggiungere un parametro GET che indica il dominio.

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

Quindi è possibile impostare una variabile di sessione che persista questi dati in tutta l'applicazione.


1
soprattutto, include il numero di porta in modo che non sia necessario concatenarlo in seguito. phpinfo suggerito da bsdnoobz mi aiuta però a trovare la soluzione giusta.

30

L'unico modo sicuro per farlo

Tutte le altre risposte in questa pagina hanno implicazioni per la sicurezza di cui devi essere consapevole.

L'unico metodo sicuro garantito per recuperare il dominio corrente è 𝓼𝓽𝓸𝓻𝓮 𝓲𝓽 𝓲𝓷 𝓪 𝓼𝓮𝓬𝓾𝓻𝓮 𝓵𝓸𝓬𝓪𝓽𝓲𝓸𝓷 𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯.

La maggior parte dei framework si occupa della memorizzazione del dominio per te, quindi ti consigliamo di consultare la documentazione per il tuo framework particolare. Se non si utilizza un framework, prendere in considerazione la memorizzazione del dominio in uno dei seguenti luoghi:

+ ------------------------------------------------- --- + ----------------------------------- +
 | Metodi sicuri per l'archiviazione del dominio | Usato da |
+ ------------------------------------------------- --- + ----------------------------------- +
 | Un file di configurazione | Joomla, Drupal / Symfony |
 | Il database | WordPress |
 | Una variabile ambientale | Laravel |
 | Un registro dei servizi | Kubernetes DNS |
+ ------------------------------------------------- --- + ----------------------------------- +


Puoi usare quanto segue ... ma non sono sicuri

Gli hacker possono fare in modo che queste variabili producano il dominio che desiderano. Ciò può comportare avvelenamenti da cache e attacchi di phishing appena percettibili.

$_SERVER['HTTP_HOST']

Ciò ottiene il dominio dalle intestazioni della richiesta che possono essere manipolate dagli hacker . Lo stesso con:

$_SERVER['SERVER_NAME']

Questo può essere migliorato se l'impostazione Apache usecanonicalname è disattivata; nel qual caso $_SERVER['SERVER_NAME']non sarà più possibile compilare con valori arbitrari e sarà sicuro. Questo è, tuttavia, non predefinito e non comune a una configurazione.


In sistemi popolari

Di seguito è riportato come ottenere il dominio corrente nei seguenti framework / sistemi:

WordPress

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

Se stai costruendo un URL in WordPress, usa semplicemente home_url o site_url o una qualsiasi delle altre funzioni URL .

laravel

request()->getHost()

La request()->getHostfunzione è ereditata da Symfony ed è stata protetta da quando il CVE-2013-4752 del 2013 è stato patchato.

Drupal

Il programma di installazione non si occupa ancora di renderlo sicuro ( numero 2404259 ). Ma in Drupal 8 è disponibile la documentazione che puoi seguire in Impostazioni host attendibili per proteggere l'installazione di Drupal dopo la quale è possibile utilizzare quanto segue:

\Drupal::request()->getHost();

Altri quadri

Sentiti libero di modificare questa risposta per includere come ottenere il dominio corrente nel tuo framework preferito. Nel fare ciò, si prega di includere un collegamento al codice sorgente pertinente o qualsiasi altra cosa che possa aiutarmi a verificare che il framework stia facendo le cose in modo sicuro.




appendice

Esempi di sfruttamento:

  1. L'avvelenamento da cache può verificarsi se una botnet richiede continuamente una pagina utilizzando l'intestazione host errata. L'HTML risultante includerà quindi collegamenti al sito Web degli aggressori in cui possono phishing i tuoi utenti. Inizialmente i collegamenti dannosi verranno restituiti solo all'hacker, ma se l'hacker fa abbastanza richieste, la versione dannosa della pagina finirà nella cache dove verrà distribuita ad altri utenti.

  2. Un attacco di phishing può verificarsi se si memorizzano collegamenti nel database in base all'intestazione degli host. Ad esempio, supponiamo che memorizzi l'URL assoluto nei profili di un utente su un forum. Usando l'intestazione sbagliata, un hacker potrebbe ottenere a chiunque faccia clic sul link del proprio profilo di essere inviato a un sito di phishing.

  3. L'avvelenamento da reimpostazione della password può verificarsi se un hacker utilizza un'intestazione host dannosa durante la compilazione del modulo di reimpostazione della password per un altro utente. Quell'utente riceverà quindi un'email contenente un link di reimpostazione della password che conduce a un sito di phishing.

  4. Ecco alcuni esempi più dannosi

Avvertenze e note aggiuntive:

  • Quando il nome utente viene disattivato, $_SERVER['SERVER_NAME']viene popolato comunque con la stessa intestazione $_SERVER['HTTP_HOST'](più la porta). Questa è la configurazione predefinita di Apache. Se tu o devops lo accendi, allora stai bene - ish - ma vuoi davvero fare affidamento su una squadra separata, o te stesso tre anni in futuro, per mantenere quella che sembrerebbe essere una configurazione minore in un non -valore predefinito? Anche se questo rende le cose sicure, vorrei evitare di fare affidamento su questa configurazione.
  • Redhat, tuttavia, attiva in modo predefinito l'utente us [ fonte ].
  • Se serverAlias viene utilizzato nella voce host virtuali e viene richiesto il dominio con alias, $_SERVER['SERVER_NAME']non verrà restituito il dominio corrente, ma verrà restituito il valore della direttiva serverName.
  • Se il serverName non può essere risolto, al suo posto viene utilizzato il comando hostname del sistema operativo [origine] .
  • Se l'intestazione host viene lasciata fuori, il server si comporterà come se usecanonical fosse su [source] .
  • Infine, ho appena provato a sfruttarlo sul mio server locale e non sono riuscito a falsificare l'intestazione degli host. Non sono sicuro se ci sia stato un aggiornamento di Apache che ha risolto questo problema o se stavo solo facendo qualcosa di sbagliato. Indipendentemente da ciò, questa intestazione sarebbe comunque sfruttabile in ambienti in cui gli host virtuali non vengono utilizzati.

Little Rant:

     Questa domanda ha ricevuto centinaia di migliaia di visualizzazioni senza una sola menzione dei problemi di sicurezza a portata di mano! Non dovrebbe essere così, ma solo perché una risposta Stack Overflow è popolare, ciò non significa che sia sicura.




1
Potresti voler menzionare la differenza tra home_url e site_url. wordpress.stackexchange.com/a/50605/13
Volomike

1
+1 per gli utenti di wordpress. Buono se devi esaminare se installato in subdir, ma nota che chiave parse_url: $urlparts['path']non è impostato se installato nella directory principale del dominio. Altrimenti $urlparts['path']restituisce la sottodirectory.
Jonas Lundman,

9

Prova $_SERVER['SERVER_NAME'].

Suggerimenti: crea un file PHP che chiama la funzione phpinfo()e vedi la sezione "Variabili PHP". Ci sono un sacco di variabili utili a cui non pensiamo mai.


puoi sempre provare a stampare_r-ing $ _SERVER e cercare

3

So che questo potrebbe non essere interamente sull'argomento, ma nella mia esperienza, trovo utile archiviare il WWW-state dell'URL corrente in una variabile.

Modifica: Inoltre, per favore vedi il mio commento qui sotto, per vedere a cosa sta arrivando.

Questo è importante quando si determina se inviare chiamate Ajax con "www" o senza:

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

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

Quando si invia una chiamata Ajax, il nome del dominio deve corrispondere a quello di nella barra degli indirizzi del browser, altrimenti si avrà Uncaught SecurityError nella console.

Quindi ho trovato questa soluzione per affrontare il problema:

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

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

Quindi, in base al fatto che $ WWW sia vero o falso, eseguire la chiamata Ajax corretta.

So che potrebbe sembrare banale, ma questo è un problema così comune che è facile inciampare.


OP ha esplicitamente richiesto il dominio e non SERVER_NAME .
Sebastian G. Marinescu,

Vero, ma in questi giorni devi preoccuparti anche del problema www.
InfiniteStack,

Perché? In JS potresti dare un'occhiata window.location. In PHP hai SERVER_NAME.
Sebastian G. Marinescu,

4
SERVER_NAME restituisce "www.site.com" anche quando "site.com" viene inserito nella barra degli indirizzi. Se stai utilizzando SERVER_NAME per tutto il codice, inevitabilmente ti imbatterai nel problema di sicurezza www / no-www, soprattutto quando si tratta di effettuare chiamate Ajax. Ma per rispondere alla tua domanda, nella programmazione PHP avanzata, a volte PHP deve generare dinamicamente codice che effettua una chiamata HTTP al server. Se l'URL di destinazione contiene "www" in una pagina che non lo fa, genererà un errore di sicurezza.
InfiniteStack

Ok ok ... l'ho letto e hai ragione. Quindi la tua risposta potrebbe essere pertinente per qualcuno. Ottimo lavoro :)
Sebastian G. Marinescu,

3

Tutti usano la parse_urlfunzione, ma a volte l'utente può passare l'argumet in un formato diverso.

Per risolvere il problema, ho creato la funzione. Controllalo:

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;
}

Basta passare l'URL e ottenere il dominio.

Per esempio,

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

restituirà il risultato sarà

stackoverflow.com

E in qualche situazione:

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

E tornerà anche stackoverflow.com.


1
$_SERVER['HTTP_HOST'] 

// per ottenere il dominio

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

// dominio con protocollo

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

// protocollo, dominio, queryString totale ** Poiché $ _SERVER ['SERVER_NAME'] non è affidabile per l'hosting multi dominio!


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.