PHP ile HTTP'den HTTPS'ye Yönlendirme


107

Bir alışveriş sepeti web sitesinde çalışıyorum ve kullanıcıyı fatura ayrıntılarını girerken bir HTTPS sayfasına yönlendirmek ve oturumu kapatana kadar sonraki sayfalarda HTTPS bağlantısını sürdürmek istiyorum.

Bunu yapmak için sunucuya ne yüklemem gerekiyor (Apache kullanıyorum) ve bu yönlendirme PHP'den nasıl yapılabilir?

Yanıtlar:


247

Şöyle bir şey deneyin (Apache ve IIS için çalışmalıdır):

if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === "off") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}

5
Her zaman çalışmıyor. Kullanmayı denedim ve $ _SERVER dizisinde 'çok fazla yeniden yönlendirme' hatası verdiği için 'https' öğesi yoktu. Başka bir yöntem kullanmanız gerekir.
Usman Zaheer

5
if( $_SERVER['HTTPS'] == "off")Bu kodun çalışmasını sağlamak için test etmem gerekiyordu . Sanırım bu, OP gibi Apache değil, IIS'de olmam.
Nick Pickering

1
@NicholasPickering Jepp, $ _SERVER değişkenleri web sunucularına göre değişebilir.
Raphael Michel

6
Not: die () veya exit (), sayfanın geri kalanının yürütülmesini (ve muhtemelen istemciye fazladan bilgi göndermesini) (yani başlığa uymayan bilgisayar korsanları veya tarayıcılara) önlemek için başlık yeniden yönlendirmelerinin arkasına yerleştirilmesi önemli olabilir.
dajon

3
Sunucu ortamınıza / kurulumunuza bağlı olarak, http / https'yi kontrol etmek için $ _SERVER ['HTTP_X_FORWARDED_PROTO'] kullanmanız gerekebilir
David Meister

19

Bu, bunu yapmanın iyi bir yoludur:

<?php
if (!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || 
   $_SERVER['HTTPS'] == 1) ||  
   isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&   
   $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
{
   $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
   header('HTTP/1.1 301 Moved Permanently');
   header('Location: ' . $redirect);
   exit();
}
?>

1
iyi çalışıyor, iyi olarak işaretlenen bir yönlendirme en azından Chrome'da çok fazla kez döndürecektir
Thomas J Younsi

Koşul !(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'her zaman yanlış olacaktır, çünkü son kısım doğruysa, ilk kısım yanlış olacaktır.
Maksimum

@Max: Ne dediğini anlamıyorum. İkinci koşul doğruysa ($ _SERVER ['HTTPS'] == 'açık'), o zaman ilk koşul da DOĞRU olmalıdır (tabii ki bu sunucu değişkeni bir değer içerdiği için ayarlanmıştır!)
OMA

7

IIS üzerinde PHP ile HTTP'den HTTPS'ye yönlendirme

MS Internet Information Services'ın (IIS) 6. sürümünü çalıştıran bir Windows sunucusunda çalışmak için HTTPS'ye yeniden yönlendirme konusunda sorun yaşıyordum . Bir Linux sunucusunda Apache ile çalışmaya daha alışkınım, bu yüzden yardım için İnternet'e döndüm ve bu, "php redirect http'den https'ye" aradığımda en yüksek sıralamalı Stack Overflow sorusuydu . Ancak seçilen cevap benim için işe yaramadı.

Bazı deneme yanılmalardan sonra, IIS ile TLS olmayan bağlantılar için $_SERVER['HTTPS']ayarlandığını keşfettim off. Aşağıdaki kodun bu soruya arama motoru aracılığıyla gelen diğer IIS kullanıcılarına yardımcı olması gerektiğini düşündüm.

<?php
if (! isset($_SERVER['HTTPS']) or $_SERVER['HTTPS'] == 'off' ) {
    $redirect_url = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header("Location: $redirect_url");
    exit();
}
?>

Düzenleme : Başka bir Yığın Taşması yanıtından daha basit bir çözüm kontrol etmektir if($_SERVER["HTTPS"] != "on").


13
@JakeSylvestre Yeterince adil. Bu sorunun etiketlenmediği göz önüne alındığında, bu apacheyanıtı, arama motoru aracılığıyla bu sayfaya rastlayabilecek diğer IIS kullanıcılarının (bulunduğum duruma benzer) yararına gönderdim. Cevapların sadece OP'nin değil, bir bütün olarak toplumun yararına olduğu görüşüne katılıyorum.
Anthony Geoghegan

6

Her zaman kullanabilirsin

header('Location: https://www.domain.com/cart_save/');

kaydetme URL'sine yeniden yönlendirmek için.

Ancak bunu .htaccess ve Apache yeniden yazma kurallarıyla yapmanızı öneririm.


13
Yönlendirmeden önce her zaman $ _SERVER ['HTTPS'] 'yi kontrol etmenizi öneririm.
Raphael Michel

$ _SERVER ['HTTPS'] her zaman ayarlanmaz, ancak önceden kontrol etmek iyi bir fikirdir. Bu yüzden Apache'de, yalnızca HTTPS'de olmadığında yeniden yönlendirme yapan yararlı bir yeniden yazma kuralıyla yapılmasını öneriyorum.
powtac

Apache, fazladan bir .htaccess dosyası kullanmamayı (çünkü yavaşladığı için) ama Apache'nin * .conf dosyası içindeki yeniden yazma kurallarını kullanmanızı önermesine rağmen.
powtac

1

AWS beanstalk sunucumda $ _SERVER ['HTTPS'] değişkenini görmüyorum. 'Http' veya 'https' olabilen $ _SERVER ['HTTP_X_FORWARDED_PROTO'] görüyorum, bu nedenle AWS'de barındırıyorsanız şunu kullanın:

if ($_SERVER['HTTP_HOST'] != 'localhost' and $_SERVER['HTTP_X_FORWARDED_PROTO'] != "https") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}
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.