Sen $ _SERVER ['HTTPS'] olmadan, HTTPS kullanılması durumunda nasıl öğrenebilirim?

12 Cevap php

Ben sunucu bağlantısı HTTPS ile güvence altına alınır ise $ _SERVER ['HTTPS'] kontrol etmek gerekir diyor çevrimiçi birçok dersler gördüm. Benim sorunum kullanan sunucular, $ _SERVER ['HTTPS'] bazı hatayla sonuçlanır Tanımlanmamış bir değişken olmasıdır. Ben her zaman tanımlanmalıdır kontrol edebilirsiniz başka bir değişkeni var mı?

Bir HTTPS bağlantısı ise sadece temiz olması için, ben şu anda gidermek için bu kodu kullanıyorum:

if(isset($_SERVER['HTTPS']))
{
    if ($_SERVER["HTTPS"] == "on") 
    {
        $secure_connection = true;
    }
}

12 Cevap

Chacha, PHP belgelerine göre: "komut HTTPS protokolü ile sorgulandığında ise boş olmayan bir değere ayarlayın." Yani eğer deyimi HTTPS üzerinde gerçekten birçok durumda yanlış dönecektir. Sen $_SERVER["HTTPS"] var ve olmayan boş olduğunu doğrulamak isteyeceksiniz. HTTPS, belirli bir sunucu için doğru ayarlanmamış durumlarda, eğer $_SERVER['SERVER_PORT'] == '443 'kontrol deneyebilirsiniz.

Ancak bazı sunucuları da boş olmayan bir değere $_SERVER['HTTPS'] set unutmayın, bu yüzden de bu değişkeni kontrol ediniz.

Referans: Documentation for $_SERVER ve $ `HTTP_SERVER_VARS [önerilmiyor]

Bu her zaman çalışması gerektiğini bile $_SERVER['HTTPS'] undefined:

function isSecure() {
  return
    (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
    || $_SERVER['SERVER_PORT'] == 443;
}

Kodu, IIS ile uyumludur.

Kimden PHP.net documentation and user comments:

Betik HTTPS protokolü ile sorgulandığında ise 1) boş olmayan bir değere ayarlayın.

2) IIS ile ISAPI kullanırken, değer istek HTTPS protokolü ile yapılmamışsa "kapalı" olacağını unutmayın. (Aynı davranış IIS7, Fast-CGI uygulaması olarak PHP çalıştırmak için rapor edilmiştir).

Ayrıca, Apache 1.x sunucuları (ve kırık tesisatları) $_SERVER['HTTPS'] sıkıca bağlayarak bile tanımlı olmayabilir. Garanti olmasa da, bağlantı noktası 443 üzerinde bağlantıları olasılıkla secure sockets, dolayısıyla ek port kontrol kullanarak, convention ile vardır.

Benim çözüm (standart koşullar ['üzerinde' $ _SERVER ['HTTPS'] ==] bir yük dengeleyici arkasında sunucularda çalışmaz çünkü) olduğunu:

$isSecure = false;
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
    $isSecure = true;
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || !empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') {
    $isSecure = true;
}
$REQUEST_PROTOCOL = $isSecure ? 'https' : 'http';

HTTP_X_FORWARDED_PROTO: a de facto standard for identifying the originating protocol of an HTTP request, since a reverse proxy (load balancer) may communicate with a web server using HTTP even if the request to the reverse proxy is HTTPS http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Common_non-standard_request_headers

Ben sadece Apache mod_ssl kullanarak sunucuyu çalıştıran bir sorunu vardı, henüz phpinfo () ve var_dump ($ _SERVER) PHP hala bağlantı noktası 80 üzerinde olduğumu düşündüğünü gösterdi.

Burada aynı konu ile herkes için benim çözüm budur ....

<VirtualHost *:443>
  SetEnv HTTPS on
  DocumentRoot /var/www/vhost/scratch/content
  ServerName scratch.example.com
</VirtualHost>

Fazlalaştı çizgi SetEnv hattıdır. Bu yerde ve yeniden başlattıktan sonra, size her zaman hayal HTTPS ortam değişkeni olmalıdır

GERÇEK cevap: [config] komut dosyası içine kopyala-yapıştır için hazır

/* configuration settings; X=edit may 10th '11 */
$pv_sslport=443; /* for it might be different, as also Gabriel Sosa stated */
$pv_serverport=80; /* X */
$pv_servername="mysite.com"; /* X */

/* X appended after correction by Michael Kopinsky */
if(!isset($_SERVER["SERVER_NAME"]) || !$_SERVER["SERVER_NAME"]) {
    if(!isset($_ENV["SERVER_NAME"])) {
        getenv("SERVER_NAME");
        // Set to env server_name
        $_SERVER["SERVER_NAME"]=$_ENV["SERVER_NAME"];
    }
}
if(!$_SERVER["SERVER_NAME"]) (
    /* X server name still empty? ... you might set $_SERVER["SERVER_NAME"]=$pv_servername; */
}

if(!isset($_SERVER["SERVER_PORT"]) || !$_SERVER["SERVER_PORT"]) {
    if(!isset($_ENV["SERVER_PORT"])) {
        getenv("SERVER_PORT");
        $_SERVER["SERVER_PORT"]=$_ENV["SERVER_PORT"];
    }
}
if(!$_SERVER["SERVER_PORT"]) (
    /* X server port still empty? ... you might set $_SERVER["SERVER_PORT"]=$pv_serverport; */
}

$pv_URIprotocol = isset($_SERVER["HTTPS"]) ? (($_SERVER["HTTPS"]==="on" || $_SERVER["HTTPS"]===1 || $_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://") :  (($_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://");

$pv_URIprotocol şimdi doğru ve kullanılmaya hazır olduğunu; Örnek $site=$pv_URIprotocol.$_SERVER["SERVER_NAME"]. Doğal olarak, dize DOĞRU ve YANLIŞ ile de değiştirilebilir. Her zaman çalışacak direkt copy-paste olduğu gibi PV PortalPress Değişken için duruyor. Bu parça, bir üretim komut kullanılabilir.

SSL normalde port 443 üzerinde çalışır gibi $_SERVER['SERVER_PORT'] kontrol edebilir, ancak bu kusursuz değildir.

Ben web sunucuları geçerken sonra büyük olasılıkla yanlış pozitif yok bu params de kabul edilebilir ve daha fazlasını bulabilirsiniz.

  1. $ _SERVER ['HTTPS_KEYSIZE']
  2. $ _SERVER ['HTTPS_SECRETKEYSIZE']
  3. $ _SERVER ['HTTPS_SERVER_ISSUER']
  4. $ _SERVER ['HTTPS_SERVER_SUBJECT']

    if($ _SERVER ['HTTPS_KEYSIZE'] != NULL){/*do foobar*/}
    

Ben bir bağlantı noktası ekleyerek iyi bir fikir olduğunu sanmıyorum - farklı yapılar ile birçok sunucusu var özel zaman. sadece değiştirmek için hatırlamak için bir şey daha ekler. doc Diyelim ki Kaisers son satırı oldukça iyi olduğunu düşünüyorum, böylece bakıyor:

if(!empty($_SERVER["HTTPS"]))
  if($_SERVER["HTTPS"]!=="off")
    return 1; //https
  else
    return 0; //http
else
  return 0; //http

mükemmel yeterli gibi görünüyor.

Tek güvenilir yöntem Igor M. tarafından açıklandığı gibi olduğu bir

$pv_URIprotocol = isset($_SERVER["HTTPS"]) ? (($_SERVER["HTTPS"]==="on" || $_SERVER["HTTPS"]===1 || $_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://") :  (($_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://");

Consider following: You are using nginx with fastcgi, by default(debian, ubuntu) fastgi_params contain directive:

fastcgi_param HTTPS $ https;

if you are NOT using SSL, it gets translated as empty value, not 'off', not 0 and you are doomed.

http://unpec.blogspot.cz/2013/01/nette-nginx-php-fpm-redirect.html

Ben kullanıyorum kısa yolu:

$secure_connection = !empty($_SERVER['HTTPS']);

Https kullanılırsa, o zaman $ secure_connection doğrudur.

Burada bir süre için kullanıyorum yeniden kullanılabilir bir fonksiyonudur. HTH.

Not: HTTPS_PORT (benim kod bir özel sabit olan) değeri sizin envrionment göre değişebilir, örneğin o 443 ya da 81 olabilir.

/**
 * Determine if this is a secure HTTPS connection
 * 
 * @return  bool    True if it is a secure HTTPS connection, otherwise false.
 */
function isSSL()
{
    if (isset($_SERVER['HTTPS'])) {
        if ($_SERVER['HTTPS'] == 1) {
            return true;
        } elseif ($_SERVER['HTTPS'] == 'on') {
            return true;
        }
    } elseif ($_SERVER['SERVER_PORT'] == HTTPS_PORT) {
        return true;
    }

    return false;
}

Hobodave gönderimizde başı olarak: "komut HTTPS protokolü ile sorgulandığında ise boş olmayan bir değere ayarlayın."

if (!empty($_SERVER['HTTPS']))
{
    $secure_connection = true;
}