Tengo mi sitio en el servidor
http://www.myserver.uk.com
Para esto tengo dos dominios,
http://one.com
y
http://two.com
Me gustaría obtener el dominio actual de PHP, pero si lo uso $_SERVER['HTTP_HOST']
, esto me mostrará
myserver.uk.com
en vez de:
one.com or two.com
¿Cómo puedo obtener el dominio, no el nombre del servidor?
Tengo PHP versión 5.2.
$_SERVER['HTTP_HOST']
. Si los sitiosone.com
ytwo.com
están "redirigiendo" utilizando un marco (i), la página en sí misma proviene de myserver.uk.com, por lo que no obtendrá el dominio real. ¿Para qué es la fuente HTMLone.com
?Respuestas:
Intenta usar esto:
$_SERVER['SERVER_NAME']
O analizar
fuente
HTTP_X_ORIGINAL_HOST
puede ser modificado por el usuario y no se puede confiar en él. Esto puede no ser siempre un problema, pero es algo a tener en cuenta.El mejor uso sería
Y se puede usar así:
Este código a continuación es una buena manera de ver todas las variables en $ _SERVER en una salida HTML estructurada con sus palabras clave resaltadas que se detiene directamente después de la ejecución. Como a veces olvido cuál usar yo mismo, creo que esto puede ser ingenioso.
fuente
El uso de
$_SERVER['HTTP_HOST']
gets me (subdominio). Maindomain.extension. Parece la solución más fácil para mí.Si realmente está 'redirigiendo' a través de un iFrame, puede agregar un parámetro GET que indique el dominio.
Y luego puede establecer una variable de sesión que conserve estos datos en toda su aplicación.
fuente
La única forma segura de hacerlo
Todas las otras respuestas en esta página tienen implicaciones de seguridad que debe tener en cuenta.
La mayoría de los marcos se encargan de almacenar el dominio por usted, por lo que deberá consultar la documentación de su marco particular. Si no está utilizando un marco, considere almacenar el dominio en uno de los siguientes lugares:
+ ------------------------------------------------- --- + ----------------------------------- +
| Métodos seguros de almacenamiento del dominio | Usado por |
+ ------------------------------------------------- --- + ----------------------------------- +
| Un archivo de configuración | Joomla, Drupal / Symfony |
El | La base de datos | WordPress |
El | Una variable ambiental | Laravel |
El | Un registro de servicio | Kubernetes DNS |
+ ------------------------------------------------- --- + ----------------------------------- +
Puedes usar lo siguiente ... pero son inseguros
Los hackers pueden hacer que estas variables generen el dominio que deseen. Esto puede provocar envenenamiento de caché y ataques de phishing apenas perceptibles.
Esto obtiene el dominio de los encabezados de solicitud que están abiertos a la manipulación por parte de piratas informáticos . Lo mismo con:
Esto puede mejorarse si la configuración de Apache usecanonicalname está desactivada; en cuyo caso
$_SERVER['SERVER_NAME']
ya no se permitirá que se rellenen con valores arbitrarios y será seguro. Sin embargo, esto no es predeterminado y no es tan común en una configuración.En sistemas populares
A continuación se muestra cómo puede obtener el dominio actual en los siguientes marcos / sistemas:
WordPress
Si está construyendo una URL en WordPress, simplemente use home_url o site_url , o cualquiera de las otras funciones de URL .
Laravel
La
request()->getHost
función se hereda de Symfony y ha sido segura desde que se reparó el CVE-2013-4752 2013 .Drupal
El instalador aún no se encarga de hacer esto seguro ( problema # 2404259 ). Pero en Drupal 8 hay documentación que puede seguir en la Configuración de host de confianza para asegurar su instalación de Drupal, después de lo cual se puede usar lo siguiente:
Otros marcos
Siéntase libre de editar esta respuesta para incluir cómo obtener el dominio actual en su marco favorito. Al hacerlo, incluya un enlace al código fuente relevante o cualquier otra cosa que me ayude a verificar que el marco está haciendo las cosas de forma segura.
Apéndice
Ejemplos de explotación:
El envenenamiento de la memoria caché puede ocurrir si una botnet solicita continuamente una página con el encabezado de hosts incorrecto. El HTML resultante incluirá enlaces al sitio web de los atacantes donde pueden phishing a sus usuarios. Al principio, los enlaces maliciosos solo se enviarán de vuelta al hacker, pero si el hacker hace suficientes solicitudes, la versión maliciosa de la página terminará en su caché, donde se distribuirá a otros usuarios.
Un ataque de phishing puede ocurrir si almacena enlaces en la base de datos en función del encabezado de los hosts. Por ejemplo, supongamos que almacena la URL absoluta en los perfiles de un usuario en un foro. Al usar el encabezado incorrecto, un hacker podría hacer que se envíe un sitio de phishing a cualquiera que haga clic en el enlace de su perfil.
La intoxicación por restablecimiento de contraseña puede ocurrir si un pirata informático utiliza un encabezado de host malicioso al completar el formulario de restablecimiento de contraseña para un usuario diferente. Ese usuario recibirá un correo electrónico que contiene un enlace de restablecimiento de contraseña que conduce a un sitio de phishing.
Aquí hay algunos ejemplos más maliciosos
Advertencias y notas adicionales:
$_SERVER['SERVER_NAME']
se rellena con el mismo encabezado$_SERVER['HTTP_HOST']
que habría utilizado de todos modos (más el puerto). Esta es la configuración predeterminada de Apache. Si usted o Devops activan esto, entonces está bien, es decir, pero ¿realmente desea confiar en un equipo separado, o en usted mismo dentro de tres años, para mantener lo que parece ser una configuración menor en un -¿valor por defecto? Aunque esto hace que las cosas sean seguras, advertiría que no confíe en esta configuración.$_SERVER['SERVER_NAME']
no devolverá el dominio actual, pero devolverá el valor de la directiva serverName.Little Rant:
¡Esta pregunta recibió cientos de miles de visitas sin una sola mención de los problemas de seguridad en cuestión! No debería ser así, pero solo porque una respuesta de desbordamiento de pila sea popular, eso no significa que sea segura.
fuente
$urlparts['path']
no está establecida si está instalada en el directorio raíz del dominio. Else$urlparts['path']
devuelve el subdirectorio.Tratar
$_SERVER['SERVER_NAME']
.Consejos: cree un archivo PHP que llame a la función
phpinfo()
y consulte la sección "Variables PHP". Hay un montón de variables útiles que nunca pensamos allí.fuente
Sé que esto podría no ser completamente sobre el tema, pero en mi experiencia, encuentro útil almacenar WWW-ness de la URL actual en una variable.
Editar: Además, vea mi comentario a continuación, para ver a qué se refiere.
Esto es importante al determinar si se deben enviar llamadas Ajax con "www" o sin:
Al despachar una llamada Ajax, el nombre de dominio debe coincidir con el de la barra de direcciones del navegador; de lo contrario, tendrá UnError de seguridad no capturado en la consola.
Entonces se me ocurrió esta solución para abordar el problema:
Luego, en función de si $ WWW es verdadero o falso, ejecute la llamada Ajax adecuada.
Sé que esto puede sonar trivial, pero este es un problema tan común que es fácil de evitar.
fuente
window.location
. En PHP tienesSERVER_NAME
.Todos están usando la
parse_url
función, pero a veces el usuario puede pasar el argumento en un formato diferente.Para arreglar eso, he creado la función. Mira esto:
Simplemente pase la URL y obtenga el dominio.
Por ejemplo,
devolverá el resultado será
Y en alguna situación:
Y también volverá
stackoverflow.com
.fuente
// para obtener el dominio
// dominio con protocolo
// protocolo, dominio, total de queryString ** ¡Como $ _SERVER ['SERVER_NAME'] no es confiable para el alojamiento de múltiples dominios!
fuente
Simplemente intente:
fuente