PHP Site URL Protokolünü Al - http - https


197

Mevcut site URL protokolünü oluşturmak için küçük bir işlev yazdım ama SSL yok ve https altında çalışıp çalışmadığını nasıl test edeceğimi bilmiyorum. Bunun doğru olup olmadığını söyleyebilir misin?

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

Yukarıdaki gibi yapmak gerekli mi yoksa sadece böyle yapabilir miyim ?:

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

SSL altında, bağlantı etiketi URL'si http kullanıyor olsa bile sunucu URL'yi otomatik olarak https'ye dönüştürmez mi? Protokolü kontrol etmek gerekli mi?

Teşekkür ederim!


1
Yerel bir web sunucusu yüklemeniz ve üzerine kendinden imzalı bir SSL sertifikası atmanız daha iyi bir seçenek olmaz mı? Bu şekilde kendiniz test edebilirsiniz.
Frazell Thomas

Evet, bu harika olurdu, ama nasıl yapacağımı bilmiyorum.

4
Bu, sorunuza cevap vermese de, sorununuza daha iyi bir çözüm (daha fazla bilmeden emin olamamam da) Protokol Göreli URL'leri kullanmak olabilir .
Reese Moore

Sadece kısa bir soru ... dinamik değilse nasıl bir işlev yapıyorsunuz. URL'yi değiştirmek için herhangi bir çeşit beslediğiniz gibi değil. Neden bir sabit tanımlamıyorsunuz? Ben de öyle yaptım. $ protokol = (! boş ($ _ SUNUCU ['HTTPS']) && $ _SERVER ['HTTPS']! == 'kapalı' || $ _SERVER ['SERVER_PORT'] == 443)? "https: //": "http: //"; define ('SITE_URL', $ protokolü. $ _ SERVER ['HTTP_HOST']. '/');
HTMLGuy

Yanıtlar:


69

Otomatik değildir. En iyi fonksiyonunuz iyi görünüyor.


19
sadece protokol kapalı bırakırsanız otomatik olduğunu kaydetmeye değer .. yani //mysqite.comyerinehttps://mysitecom
bir kez bir ayı güreşti.

4
@Pamblam, // bağlantınız bir e-postada olmadığı sürece harika çalışıyor :)
TimoSolo

Veya bir xhr isteğinde
Lucas Morgan

86

Bu tür bir sorunu çözmek için çok daha uygun bir yol olmasına rağmen geç olduğunu biliyorum! Diğer çözümler oldukça dağınık; ben böyle yapardım:

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

... hatta şartlar olmadan bile:

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

Bir bak bakalım $_SERVER["SERVER_PROTOCOL"]


20
Bu "https" ile çalışma stackoverflow.com/questions/16825243/…
wormhit

@wormhit, esas olarak web sunucunuzun nasıl yapılandırıldığına bağlıdır
Ivo

striposBunun yerine kullanmanızın bir nedeni var strposmı?
Fred

12
$_SERVER['SERVER_PROTOCOL']Protokol sürümünün saklanması HTTP/1.0veya yapılmasına HTTP/1.1bağlı httpsolarak, http sorgusundan gelen bu dize hakkında bilgi depolayarak ne tür HTTP sunucusu yapılandırmasından bahsediyorsunuz ?
regilero

1
Benim durumumda çalışmıyor! $ _SERVER ['SERVER_PROTOCOL'], protokol https iken "HTTP" ("S" olmadan) içerir. $ _SERVER ['HTTPS'] öğesini kontrol etmek daha uygundur.
Simon Hi

68

Bu benim için çalışıyor

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
Bir proxy (benim durumumda CloudFlare gibi) kullanıyorsanız işe yarayan çözüm budur
Jesús Carrera

1
Bu doğru - sadece 443 numaralı bağlantı noktasını kullandığınız için https varsaymamalısınız
Mark Fisher

24

Bazı değişiklikler:

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

17

kısa yol

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

3
REQUEST_SCHEMEgüvenilir değil
Farnabaz

5
REQUEST_SCHEME, Apache 2.4'e kadar kullanılamaz.
KenB

7

Port numarasını test etmek bana göre iyi bir uygulama olmadığı için benim çözümüm:

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

HTTPSSabit getiri TRUEdurumunda $_SERVER['HTTPS']kurmak ve ya "evet" "açık", "1" "true" e eşittir. Aksi takdirde FALSE değerini döndürür.


Bu muhtemelen en iyi cevaptır. Bu cevapların birçoğu, yalnızca belirli bir yüzdede olacaktır. Örneğin, insanlar sadece $ _SERVER ['HTTPS'] öğesinin ayarlanıp ayarlanmadığını kontrol ediyor. Birçok çerçeve bu değişkeni yanlış veya 'kapalı' vb. Olarak ayarlar, bu nedenle basit bir şekilde ayarlanıp ayarlanmadığını kontrol etmez.
Daniel Dewhurst

1
Bu çoğu durumda işe yarar olsa da, SNAFU yapılandırmasının olduğu ve $ _SERVER ['HTTPS'] 'nin aslında "kapalı" olarak ayarlandığı zamanlar olmuştur. Kodunuz yine de testi "geçiyor" olarak değerlendirir, bu nedenle belirli bir ayara izin verecek şekilde değiştirilmesi gerekir.
Dave Morton

6

IIS dışındaki herhangi bir sistem için bu, sitenin kendi URL'sini tanımlamak için yeterlidir:

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

veya

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

tam olarak ne istediğinize bağlıdır: HTTP_HOST ve SERVER_NAME


5

Proxy durumunda SERVER_PORT, doğru değeri vermeyebilir, bu yüzden benim için işe yarayan şey budur -

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

4

Protokol ayrıntılarını almak için bu sunucu değişkenini kullanın:

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

Bu sunucu değişkeninin güvenilir olmadığını unutmayın. Daha fazla bilgi için şuraya bakın: $ _SERVER ['REQUEST_SCHEME'] güvenilir midir?


Yayınınıza yalnızca kodu değil, biraz daha bilgi ekleyebilir misiniz? Örneğin, bunun neden soruya bir cevap olduğunu açıklayın?
ndsmyter

3

Bunun eski bir soru olduğunu biliyorum, ancak sitemde bunu test etmem gerektiğinden bugün bununla karşılaştım. Yukarıdaki cevapların gereksiz yere karmaşık olduğu anlaşılıyor. Site protokolünü oluşturmak için tek yapmanız gereken test etmek$_SERVER['HTTPS']

Protokol HTTPS kullanıyorsa, $_SERVER['HTTPS']'on' döndürecektir. Değilse, değişken boş kalır. Örneğin:
// 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';
} 

HTTPS'yi kolayca ve temiz bir şekilde test etmek ve buna göre uygulamak için yukarıdakileri kullanabilirsiniz. :)


2
Her sunucuda bu $ _SERVER ['HTTPS'] yoktur
ChrisDeDavidMindflowAU

2

benim sistemimde çalışan Rid Iculous'un cevabını kullanarak bir fonksiyon yaptı .

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

Umarım yardımcı olur


2

En çok oy alan cevapları test ettim ve bu benim için çalışmadı , ben kullanarak sona erdi:

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

Bazı web sunucuları desteklemez $_SERVER["HTTPS"]ve bu nedenle kodunuz http://olması https://
gerekse

Sunucu desteklemiyorsa, httpskod neden yine de dönesin ki https?
CONvid19

Sunucum https'yi destekliyor, ancak $_SERVER["HTTPS"]değişken hiçbir zaman tanımlanmadı.
nathanfranke

2 yorumunuzla kafam karıştı. Bu özel durumları kapsayan yeni bir cevap oluşturursanız daha iyi olabilir. Teşekkürler ve iyi şanslar!
CONvid19

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


echo $protocal;

2

CodeIgniter'dan alınmıştır:

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

https veya http'nin en iyi çözümü bunu kullanın:

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

Ancak https veya http'yi görüntüleyemez, bu nedenle yalnızca resim vb. Gibi site içeriğinizi bağlamak için kullanılır.

sitenizi https'de yeniden yönlendirmek istiyorsanız, bu kodu .htaccess dosyasına ekleyin:

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

Değişim www.your-domain.com sizin dowmain adıyla.


0

İşte bunu nasıl yapacağım ... Rid Iculous'un cevabının kısa bir if else versiyonu ...

$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

Bence tam fonk şöyle görünmelidir:

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

Notlar:

  • HTTP_X_FORWARDED_PROTO için de bakmalısınız (örneğin, proxy sunucusu ise)
  • 443 bağlantı noktasına güvenmek güvenli değildir (https farklı bağlantı noktasında sunulabilir)
  • REQUEST_SCHEME güvenilir değil

0

Bu partiye biraz geç kaldığımı biliyorum, ama çok cesaret kırılmış ve hatta bazı PHP çerçevelerinde devre dışı bırakılmış olarak $ _SERVER kullanmamayı tercih ederseniz; ve bir apache web sunucunuz varsa, bu nedenle yerel komutunu kullanabilirsiniz:

$protocol = apache_getenv('HTTPS') ? 'https:' : 'http:';
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.