2011-02-24 214 views
70

我正在購物車網站上工作,我想在用戶輸入帳單詳細信息時將用戶重定向到HTTPS頁面,並在下一頁保持HTTPS連接,直到他註銷。使用PHP從HTTP重定向到HTTPS

爲了做到這一點,我需要在服務器上安裝什麼(我使用的是Apache),以及如何從PHP完成此重定向?

回答

166

嘗試是這樣的(應爲Apache和IIS工作):

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

它不總是工作。我嘗試過使用它,並且$ _SERVER數組中沒有'https'元素,因此它給出了'太多重定向'的錯誤。將需要使用其他方法。 – 2012-04-09 16:14:40

+0

我在幾分鐘內編輯了這個問題,也許這會對你有用 – 2012-04-14 22:24:53

+5

我不得不測試'if($ _SERVER ['HTTPS'] ==「off」)'讓這段代碼正常工作。我認爲這是因爲我在IIS上,而不是像OP那樣的Apache。 – 2013-04-26 19:43:29

5

您可以隨時使用

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

重定向到URL保存。

但我會建議通過.htaccess和Apache重寫規則來做到這一點。

+11

我總是建議重定向前檢查$ _ SERVER [「HTTPS」]。 – 2011-02-24 15:01:55

+0

$ _SERVER ['HTTPS']並不總是設置,但最好先檢查一下。這就是爲什麼我建議在Apache中使用有用的重寫規則來做到這一點,它只在不使用HTTPS時重定向。 – powtac 2011-02-24 15:03:23

+0

儘管Apache建議不要使用額外的.htaccess文件(因爲它會減慢速度),而是使用Apache * .conf中的重寫規則。 – powtac 2013-05-15 08:27:50

3

從HTTP重定向到HTTPS與PHP在IIS

我遇到了麻煩重定向到HTTPS,以在Windows工作服務器 運行版本6的MS Internet信息服務(IIS)。我更多 用於在Linux主機上使用Apache,所以我轉向互聯網尋求 幫助,這是當我搜索 爲「php redirect http to https」時排名最高的堆棧溢出問題。但是,所選答案對我來說不起作用 。

一些試驗和錯誤之後,我發現,與IIS,$_SERVER['HTTPS']是 設置爲off非TLS連接。我認爲下面的代碼 可以幫助任何其他通過搜索引擎來到這個問題的IIS用戶。

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

編輯:從另一個Stack Overflow answer, 一個簡單的解決方法是檢查if($_SERVER["HTTPS"] != "on")

+0

好吧......但是op說他正在使用apache – 2016-03-22 23:02:54

+6

@JakeSylvestre夠了。鑑於這個問題沒有被標記爲'apache',我發佈了這個答案,以便其他IIS用戶(類似於我所處的情況)可能會通過搜索引擎遇到此頁面。我贊同這樣的觀點,即答案是爲了整個社區的利益,而不僅僅是OP。 – 2016-03-22 23:36:58

5

這是一個很好的辦法做到這一點:

<?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

效果不錯,標記爲良好的那個會在Chrome中至少返回一次重定向 – 2017-08-30 20:55:07