full - PHP Get Site URL Protocol-http vs https
php get url (15)
He escrito una pequeña función para establecer el protocolo de URL del sitio actual, pero no tengo SSL y no sé cómo probar si funciona bajo https. ¿Me puede decir si esto es correcto?
function siteURL()
{
$protocol = (!empty($_SERVER[''HTTPS'']) && $_SERVER[''HTTPS''] !== ''off'' || $_SERVER[''SERVER_PORT''] == 443) ? "https://" : "http://";
$domainName = $_SERVER[''HTTP_HOST''].''/'';
return $protocol.$domainName;
}
define( ''SITE_URL'', siteURL() );
¿Es necesario hacerlo como antes o simplemente puedo hacerlo ?:
function siteURL()
{
$protocol = ''http://'';
$domainName = $_SERVER[''HTTP_HOST''].''/''
return $protocol.$domainName;
}
define( ''SITE_URL'', siteURL() );
Con SSL, ¿el servidor no convierte automáticamente la url a https, incluso si la URL de la etiqueta de anclaje usa http? ¿Es necesario verificar el protocolo?
¡Gracias!
Algunos cambios:
function siteURL() {
$protocol = ((!empty($_SERVER[''HTTPS'']) && $_SERVER[''HTTPS''] != ''off'') ||
$_SERVER[''SERVER_PORT''] == 443) ? "https://" : "http://";
$domainName = $_SERVER[''HTTP_HOST''];
return $protocol.$domainName;
}
Así es como lo hago ... es una versión resumida de la respuesta de Rid Iculous ...
$protocol = isset($_SERVER[''HTTPS'']) && ($_SERVER[''HTTPS''] === ''on'' || $_SERVER[''HTTPS''] === 1) || isset($_SERVER[''HTTP_X_FORWARDED_PROTO'']) && $_SERVER[''HTTP_X_FORWARDED_PROTO''] === ''https'' ? ''https'' : ''http'';
Como probar el número de puerto no es una buena práctica según yo, mi solución es:
define(''HTTPS'', isset($_SERVER[''HTTPS'']) && filter_var($_SERVER[''HTTPS''], FILTER_VALIDATE_BOOLEAN));
La constante HTTPS
devuelve TRUE
si $_SERVER[''HTTPS'']
está configurado y es igual a "1", "verdadero", "encendido" o "sí". Devuelve FALSO de lo contrario.
En caso de proxy, SERVER_PORT
puede no dar el valor correcto, así que esto es lo que funcionó para mí:
$protocol = ((!empty($_SERVER[''HTTPS'']) && $_SERVER[''HTTPS''] != ''off'') || $_SERVER[''SERVER_PORT''] == 443 || $_SERVER[''HTTP_X_FORWARDED_PORT''] == 443) ? "https://" : "http://"
Esto funciona para mí
if (isset($_SERVER[''HTTPS'']) &&
($_SERVER[''HTTPS''] == ''on'' || $_SERVER[''HTTPS''] == 1) ||
isset($_SERVER[''HTTP_X_FORWARDED_PROTO'']) &&
$_SERVER[''HTTP_X_FORWARDED_PROTO''] == ''https'') {
$protocol = ''https://'';
}
else {
$protocol = ''http://'';
}
No es automático Tu función superior se ve bien.
Para cualquier sistema, excepto IIS, esto es suficiente para definir la URL del sitio:
$siteURL=''http''.(empty($_SERVER[''HTTPS''])?'''':''s'').''://''.$_SERVER[''HTTP_HOST''].''/'';
o
$siteURL=''http''.(empty($_SERVER[''HTTPS''])?'''':''s'').''://''.$_SERVER[''SERVER_NAME''].''/'';
depende de lo que desee exactamente: HTTP_HOST vs. SERVER_NAME
Sé que es tarde, ¡aunque hay una forma mucho más conveniente de resolver este tipo de problema! las soluciones que se muestran arriba son bastante desordenadas, y si alguien alguna vez vuelve a verificar esto, hay cómo lo haría:
$protocol = stripos($_SERVER[''SERVER_PROTOCOL''],''https'') === true ? ''https://'' : ''http://'';
o incluso sin condición si no te gusta
$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,strpos( $_SERVER["SERVER_PROTOCOL"],''/''))).''://'';
Eche un vistazo a $_SERVER["SERVER_PROTOCOL"]
Sé que esta es una vieja pregunta, pero me encontré con esto hoy porque necesitaba probar esto en mi sitio. Parece que las respuestas anteriores son innecesariamente complicadas. Para establecer el protocolo del sitio, todo lo que tiene que hacer es probar $_SERVER[''HTTPS'']
Si el protocolo usa HTTPS, entonces $_SERVER[''HTTPS'']
volverá a ''on''. Si no, la variable permanecerá vacía. Por ejemplo:
// test if HTTPS is being used. If it is, the echo will return ''$SSL_test: on''. If not HTTPS, ''$SSL_test'' will remain empty.
$ SSL_test = $ _SERVER [''HTTPS''];
echo ''<p>$SSL_test: ''.$SSL_test.''</p>'';
if($SSL_test == true) {
echo ''You/'re using SSL'';
} else {
echo ''You/'re not using SSL'';
}
Puede usar lo anterior para probar de manera fácil y limpia para HTTPS e implementar en consecuencia. :)
Use esta variable de servidor para obtener los detalles del protocolo:
$scheme = $_SERVER[''REQUEST_SCHEME''] . ''://'';
echo $scheme; //it gives http:// or https://
Tenga en cuenta que esta variable del servidor no es confiable. Para obtener más información, consulte: ¿Es $ _SERVER [''REQUEST_SCHEME''] confiable?
camino corto
$scheme = $_SERVER[''REQUEST_SCHEME''] . ''://'';
es la mejor solución de https o http usar esto:
<?php
$protocol = ''//'';
$site_url = $protocol.$_SERVER["HTTP_HOST"];
?>
Pero no puede mostrar https o http, por lo que solo se utiliza para vincular el contenido de su sitio como imagen, etc.
si desea redirigir su sitio en https, agregue este código en el archivo .htaccess:
<IfModule mod_rewrite.c>
RewriteCond %{HTTP:CF-Visitor} ''"scheme":"http"''
RewriteRule ^(.*)$ https://www.your-domain.com$1 [L]
</IfModule>
Cambie www.your-domain.com con su nombre de dominio.
hizo una función usando la respuesta de Rid Iculous que funcionó en mi sistema.
function site_protocol() {
if(isset($_SERVER[''HTTPS'']) && ($_SERVER[''HTTPS''] == ''on'' || $_SERVER[''HTTPS''] == 1) || isset($_SERVER[''HTTP_X_FORWARDED_PROTO'']) && $_SERVER[''HTTP_X_FORWARDED_PROTO''] == ''https'') return $protocol = ''https://''; else return $protocol = ''http://'';
}
Espero eso ayude
Probé la respuesta más votada y no funcionó , terminé usando:
$protocol = isset($_SERVER[''HTTPS'']) ? ''https://'' : ''http://'';
$protocal = ''http'';
if ($_SERVER[''HTTP_X_FORWARDED_PROTO''] == ''https'' || $_SERVER[''HTTPS''] == ''on'') {$protocal = ''https'';}
echo $protocal;