簡體   English   中英

如果頁面是PHP,則PHP重定向到HTTPS

[英]PHP redirect to HTTPS if page is

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

我知道我可以簡單地將標頭重定向更改為包括https而不是http,但是用戶可以鍵入http://domain.com/sign-in.php?redirect=my-account,因此只需確保這種情況登錄即可(或其他)通過https進行。

任何幫助表示贊賞

干得好。

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

$ _SERVER ,它是一個包含諸如標題,路徑和腳本位置之類的信息的數組。

您可以檢查$ _SERVER,特別是“ SERVER_PROTOCOL”

http://php.net/manual/en/reserved.variables.server.php

您的代碼中應該有一部分始終在每個頁面上運行。 在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,並且具有更好的Internet連接,最終將全部使用HTTPS進行沖浪。 重要的是要確保應該安全的頁面是安全的,而不是確保不需要安全的頁面不是安全的。

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

使用init類/腳本的一部分-您可以運行代碼來檢查該頁面是否需要先使用SSL,但這是強制重定向到SSL的實際代碼(REQUEST_URI提供了所有目錄等,以獲取正確的路徑)。 。

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

永久移動301也可以防止產生負面的SEO。

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

要確定是否在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()之類的來過濾用戶輸入(包括這些輸入filter_input()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM