PHP Get Site URL Protocol - http vs https


197

Ich habe eine kleine Funktion geschrieben, um das aktuelle Site-URL-Protokoll einzurichten, aber ich habe kein SSL und weiß nicht, wie ich testen soll, ob es unter https funktioniert. Kannst du mir sagen, ob das richtig ist?

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

Ist es notwendig, es wie oben zu machen oder kann ich es einfach so machen?:

function siteURL()
{
    $protocol = 'http://';
    $domainName = $_SERVER['HTTP_HOST'].'/'
    return $protocol.$domainName;
}
define( 'SITE_URL', siteURL() );

Konvertiert der Server unter SSL die URL nicht automatisch in https, selbst wenn die URL des Ankertags http verwendet? Muss das Protokoll überprüft werden?

Danke dir!


1
Wäre es nicht eine bessere Option für Sie, einen lokalen Webserver zu installieren und ein selbstsigniertes SSL-Zertifikat darauf zu werfen? Auf diese Weise können Sie es selbst testen.
Frazell Thomas

Ja, das wäre großartig, aber ich weiß nicht, wie ich es machen soll.

4
Obwohl dies Ihre Frage nicht beantwortet, besteht eine bessere Lösung für Ihr Problem (obwohl ich nicht sicher sein kann, ohne mehr zu wissen) darin, protokollrelative URLs zu verwenden .
Reese Moore

Nur eine kurze Frage ... warum machst du eine Funktion, wenn sie nicht dynamisch ist? Es ist nicht so, dass du ihm irgendwelche Vars fütterst, um die URL zu ändern. Warum nicht eine Konstante definieren? Das ist, was ich tat. $ protocol = (! empty ($ _ SERVER ['HTTPS']) && $ _SERVER ['HTTPS']! == 'off' || $ _SERVER ['SERVER_PORT'] == 443)? "https: //": "http: //"; define ('SITE_URL', $ protocol. $ _ SERVER ['HTTP_HOST']. '/');
HTMLGuy

Antworten:


69

Es ist nicht automatisch. Ihre Top-Funktion sieht in Ordnung aus.


19
Es ist erwähnenswert, dass es automatisch ist, wenn Sie das Protokoll einfach weglassen. Das heißt, //mysqite.comanstatthttps://mysitecom
ich habe einmal mit einem Bären gerungen.

4
@Pamblam, // funktioniert großartig, es sei denn, Ihr Link befindet sich in einer E-Mail :)
TimoSolo

Oder in einer xhr Anfrage
Lucas Morgan

86

Ich weiß, dass es spät ist, obwohl es einen viel bequemeren Weg gibt, diese Art von Problem zu lösen! Die anderen Lösungen sind ziemlich chaotisch; so würde ich es machen:

$protocol = stripos($_SERVER['SERVER_PROTOCOL'],'https') === 0 ? 'https://' : 'http://';

... oder auch ohne Bedingung, wenn Sie es vorziehen:

$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,strpos( $_SERVER["SERVER_PROTOCOL"],'/'))).'://';

Schau es dir an $_SERVER["SERVER_PROTOCOL"]


20
Dies funktioniert nicht mit "https" stackoverflow.com/questions/16825243/…
Wurmhit

@wormhit es hängt hauptsächlich davon ab, wie Ihr Webserver konfiguriert ist
Ivo

Gibt es einen Grund, warum Sie striposanstelle von verwenden strpos?
Fred

12
$_SERVER['SERVER_PROTOCOL']Welche Art von HTTP-Serverkonfiguration wird zum Speichern HTTP/1.0oder HTTP/1.1abhängig von der Protokollversion verwendet, um httpsInformationen zu dieser Zeichenfolge zu speichern, die aus der http-Abfrage stammen?
Regilero

1
Funktioniert in meinem Fall nicht! $ _SERVER ['SERVER_PROTOCOL'] enthält "HTTP" (ohne "S"), während das Protokoll https ist. Das Aktivieren von $ _SERVER ['HTTPS'] ist besser geeignet.
Simon Hi

68

Das funktioniert bei mir

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://';
}

3
Dies ist die Lösung, die funktioniert, wenn ein Proxy verwendet wird (wie in meinem Fall CloudFlare)
Jesús Carrera

1
Dies ist richtig - Sie sollten https nicht annehmen, nur weil Sie Port 443 verwenden.
Mark Fisher

24

Einige Veränderungen:

function siteURL() {
  $protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || 
    $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  $domainName = $_SERVER['HTTP_HOST'];
  return $protocol.$domainName;
}

16

kurzer Weg

$scheme = $_SERVER['REQUEST_SCHEME'] . '://';

3
REQUEST_SCHEMEist nicht zuverlässig
Farnabaz

5
REQUEST_SCHEME ist erst in Apache 2.4 verfügbar.
KenB

7

Da das Testen der Portnummer meiner Meinung nach keine gute Praxis ist, lautet meine Lösung:

define('HTTPS', isset($_SERVER['HTTPS']) && filter_var($_SERVER['HTTPS'], FILTER_VALIDATE_BOOLEAN));

Die HTTPSKonstante gibt TRUEif zurück, wenn sie $_SERVER['HTTPS']gesetzt ist und gleich "1", "true", "on" oder "yes" ist. Gibt sonst FALSE zurück.


Dies ist wahrscheinlich die beste Antwort. Viele dieser Antworten werden nur in einem Prozentsatz von Situationen angezeigt. Zum Beispiel prüfen die Leute nur, ob $ _SERVER ['HTTPS'] gesetzt ist. Viele Frameworks setzen diese Variable als false oder 'off' usw., daher funktioniert es nicht, zu überprüfen, ob sie einfach gesetzt ist.
Daniel Dewhurst

1
Während dies in den meisten Situationen funktioniert, gab es Zeiten, in denen eine Konfiguration SNAFU vorhanden war und $ _SERVER ['HTTPS'] tatsächlich auf "Aus" gesetzt war. Ihr Code würde dies weiterhin als "Bestehen" des Tests betrachten und sollte daher geändert werden, um diese bestimmte Einstellung zu berücksichtigen.
Dave Morton

6

Für jedes System außer IIS reicht dies völlig aus, um die URL der Site selbst zu definieren:

$siteURL='http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_HOST'].'/';

oder

$siteURL='http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].'/';

hängt davon ab, was Sie genau wollen: HTTP_HOST vs. SERVER_NAME


5

Im Falle eines Proxys geben die SERVER_PORTmöglicherweise nicht den richtigen Wert an, so dass dies für mich funktioniert hat -

$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) ? "https://" : "http://"

4

Verwenden Sie diese Servervariable, um die Protokolldetails abzurufen:

 $scheme = $_SERVER['REQUEST_SCHEME'] . '://';
 echo $scheme; //it gives http:// or https://

Beachten Sie, dass diese Servervariable unzuverlässig ist. Weitere Informationen finden Sie unter: Ist $ _SERVER ['REQUEST_SCHEME'] zuverlässig?


Können Sie Ihrem Beitrag weitere Informationen hinzufügen und nicht nur den Code? Erklären Sie zum Beispiel, warum dies eine Antwort auf die Frage ist.
Ndsmyter

3

Ich weiß, dass dies eine alte Frage ist, aber ich bin heute darauf gestoßen, da ich dies auf meiner Website testen musste. Es scheint, dass die obigen Antworten unnötig kompliziert sind. Um das Site-Protokoll zu erstellen, müssen Sie lediglich testen$_SERVER['HTTPS']

Wenn das Protokoll HTTPS verwendet, $_SERVER['HTTPS']wird 'on' zurückgegeben. Wenn nicht, bleibt die Variable leer. Beispielsweise:
// 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';
} 

Mit den oben genannten Informationen können Sie HTTPS einfach und sauber testen und entsprechend implementieren. :) :)


2
Nicht jeder Server hat dieses $ _SERVER ['HTTPS']
ChrisDeDavidMindflowAU

2

hat eine Funktion mit der Antwort von Rid Iculous erstellt , die auf meinem System funktioniert hat.

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://';
}

Ich hoffe es hilft


2

Ich habe die am häufigsten gewählte Antwort getestet und es hat bei mir nicht funktioniert. Am Ende habe ich Folgendes verwendet:

$protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';

Einige Webserver unterstützen dies nicht $_SERVER["HTTPS"]und daher wird Ihr Code möglicherweise zurückgegeben, http://selbst wenn dies der Fall sein solltehttps://
nathanfranke

Wenn der Server nicht unterstützt https, warum sollte der Code dann immer noch zurückgegeben werden https?
CONvid19

Mein Server unterstützt https, aber die $_SERVER["HTTPS"]Variable wird nie definiert.
Nathanfranke

Ich bin verwirrt von Ihren 2 Kommentaren. Es ist wahrscheinlich besser, wenn Sie eine neue Antwort erstellen, die diese Sonderfälle abdeckt. Danke und viel Glück!
CONvid19

2
$protocal = 'http';
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || $_SERVER['HTTPS'] == 'on') {$protocal = 'https';}


echo $protocal;

2

Aus CodeIgniter extrahiert:

if ( ! function_exists('is_https'))
{
    /**
     * Is HTTPS?
     *
     * Determines if the application is accessed via an encrypted
     * (HTTPS) connection.
     *
     * @return  bool
     */
    function is_https()
    {
        if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')
        {
            return TRUE;
        }
        elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https')
        {
            return TRUE;
        }
        elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')
        {
            return TRUE;
        }

        return FALSE;
    }
}

0

Es ist die beste Lösung von https oder http verwenden Sie diese:

<?php
$protocol = '//';  
$site_url = $protocol.$_SERVER["HTTP_HOST"];
?>

Es kann jedoch kein https oder http angezeigt werden, sodass nur der Inhalt Ihrer Website wie Bilder usw. verknüpft wird.

Wenn Sie Ihre Site in https umleiten möchten, fügen Sie diesen Code in die .htaccess-Datei ein:

<IfModule mod_rewrite.c>
 RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
 RewriteRule ^(.*)$ https://www.your-domain.com$1 [L]
</IfModule>

Ändern Sie www.your-domain.com mit Ihrem Dowmain-Namen.


0

Hier ist , wie ich es tun ... es ist eine Kurzschrift if else - Version Rid Iculous die Antwort ...

$protocol = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] === 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ? 'https' : 'http';

0

Ich denke, die komplette Funktion sollte so aussehen:

function siteURL()
{
    $protocol =  "http://";
    if (
        //straight
        isset($_SERVER['HTTPS']) && in_array($_SERVER['HTTPS'], ['on', 1])
        ||
        //proxy forwarding
        isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'
    ) {
        $protocol = 'https://';
    }

    $domainName = $_SERVER['HTTP_HOST'];
    return $protocol . $domainName;
}

Anmerkungen:

  • Sie sollten auch nach HTTP_X_FORWARDED_PROTO suchen (z. B. wenn Proxyserver)
  • Das Verlassen auf den 443-Port ist nicht sicher (https kann auf einem anderen Port bereitgestellt werden).
  • REQUEST_SCHEME nicht zuverlässig

0

Ich weiß, dass ich zu spät zu dieser Party komme, aber wenn Sie es vorziehen, $ _SERVER nicht zu verwenden, da dies stark entmutigt und auf einigen PHP-Frameworks sogar deaktiviert ist; und Sie einen Apache-Webserver haben, können Sie es Native Command thusly: -

$protocol = apache_getenv('HTTPS') ? 'https:' : 'http:';
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.