2013-03-19 48 views
-1

我需要一個PHP if/else語句,如果sign-in.php或register.php頁面是通過HTTP訪問的,我想重定向到HTTPS否則,如果訪問了任何其他頁面例如,如果用戶嘗試訪問受限制的頁面(http://domain.com/my-account.php),則HTTPS會重定向到HTTP並附加任何查詢字符串,但該站點會將用戶重定向到http://domain.com/sign-in.php?redirect=my-account,但我希望頁面重定向到https://domain.com/sign-in.php?redirect=my-accountPHP重定向到HTTPS如果頁面是

我知道我可以簡單地將頭重定向改爲包含https而不是http,但用戶可能鍵入http://domain.com/sign-in.php?redirect=my-account,因此只需確保這種情況是否發生在https上發生登錄(或其他)。

任何幫助表示讚賞

+0

我發現了幾個直接放在頁面上的腳本(如下圖),但我希望所有的檢查都可以在單個語句中完成,例如if(page =='sign-in .php'|| page =='register.php')等等,並放置在包含頁面頂部的重定向頁面中。 – puks1978 2013-03-19 21:31:34

回答

4

在這裏你去。

//force the page to use ssl 
if ($_SERVER["SERVER_PORT"] != 443) { 
    $redir = "Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; 
    header($redir); 
    exit(); 
} 

$_SERVER,它是一個包含信息,如標題,路徑和腳本位置的陣列。

+0

謝謝你。我正要編輯問題以包含查詢字符串。有時候頁面會是sign-in.php?redirect =我的帳戶,例如 – puks1978 2013-03-19 21:22:06

+0

Dint讓你,你可以通過編輯來解釋它嗎? – 2013-03-19 21:23:55

+0

只是保持一個會話。如果用戶登錄,設置會話變量,如$ _SESSION ['loggedIn'] = true;在所有需要重定向的頁面上,如果未登錄,請在所有頁面頂部檢查$ _SESSION ['loggedIn']變量。如果(會話變量!= true){ //重定向到登錄頁面,也設置重定向參數。 } – 2013-03-19 21:31:41

0

應該有一部分代碼總是在每個頁面上運行。在MVC中,它將位於您的基礎控制器中。其他設計可能在每個頁面上包含一個init.php文件。

在這個文件中有一個需要HTTPS的頁面的白名單。

$requires_https = array(
    'sign-in.php' => TRUE, 
    'register.php' => TRUE 
); 

然後,你需要確定被請求的頁面。

$url_info = pathinfo($_SERVER['REQUEST_URI']); 
$page = $url_info['filename']; 

下一個檢查,如果你是在HTTP或HTTPS

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

最後,你可以做的檢查:

if (isset($requires_https[$page]) AND ! $is_secure) 
    header('Location: https://www.yoursite.com/' . $page); 
elseif (! isset($requires_https[$page]) AND $is_secure) 
    header('Location: http://www.yoursite.com/' . $page); 

這絕對可以在在最後一部分通過使用改進自定義重定向功能和一個site_url函數,可以選擇是否安全,並構建正確的URL。

值得一提的是,如果有人在HTTPS中繼續瀏覽,通常無關緊要。實際上,Google的大部分服務都採用HTTPS,並且具有更好的互聯網連接衝浪最終都將通過HTTPS完成。唯一重要的是確保應該安全的頁面是安全的,而不是確保不需要安全的頁面不安全。

0
if ($_SERVER['SERVER_PORT'] != 443) { 
    header("HTTP/1.1 301 Moved Permanently"); 
    header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); 
    exit(); 
} 

使用的初始化類/腳本的一部分 - 您可以運行代碼來檢查,如果這個頁面應該要求SSL之前,但這是實際的代碼來強制重定向到SSL(和REQUEST_URI提供任何迪爾斯等..得到正確的道路)。

在單個頁面上使用(即登錄和註冊) - 這將在SSL中將用戶重定向到此頁面(將此代碼放在頂部附近)。

永久移動301也將阻止任何負面的SEO。

0

(A更多)完整方法:(包括查詢字符串)

要確定是否採用https:

$secure = (!empty(filter_input(INPUT_SERVER, 'HTTPS')) && 
    filter_input(INPUT_SERVER, 'HTTPS') !== 'off') || 
    filter_input(INPUT_SERVER, 'SERVER_PORT') == 443; 

按照https://stackoverflow.com/a/2886224

然後

重定向和包括查詢字符串:

if($secure){ 
    header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); 
} 

使用REQUEST_URI代替PHP_SELF將包含查詢參數(在URL中的?之後的內容)。

並一如既往地用filter_input()等過濾您的用戶輸入(包括這些)。