如果页面不可用,PHP重定向到HTTPS

如果页面不可用,PHP重定向到HTTPS,php,Php,我需要一个PHP if/else语句,如果sign-in.PHP或register.PHP页面是通过HTTP访问的,我想重定向到HTTPS else如果通过HTTPS访问任何其他页面,重定向到HTTP plus并附加任何查询字符串,例如,如果用户试图访问受限页面(),则站点会将用户重定向到,我希望页面重定向到 我知道我可以简单地将头重定向更改为包含https而不是http,但用户可能会键入,因此只需确保这种情况是否发生,登录(或其他)是否发生在https上 非常感谢您的帮助您可以查看$\u服务器

我需要一个PHP if/else语句,如果sign-in.PHP或register.PHP页面是通过HTTP访问的,我想重定向到HTTPS else如果通过HTTPS访问任何其他页面,重定向到HTTP plus并附加任何查询字符串,例如,如果用户试图访问受限页面(),则站点会将用户重定向到,我希望页面重定向到

我知道我可以简单地将头重定向更改为包含https而不是http,但用户可能会键入,因此只需确保这种情况是否发生,登录(或其他)是否发生在https上


非常感谢您的帮助

您可以查看$\u服务器,特别是“服务器协议”

给你

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

,它是一个数组,包含头、路径和脚本位置等信息。

应该有一部分代码始终在每个页面上运行。在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上网,这通常并不重要。事实上,谷歌的大部分服务都使用HTTPS,随着互联网连接的改善,冲浪最终都将使用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的实际代码(请求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;
依照

然后重定向并包含查询字符串:

if($secure){
  header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
}
使用
REQUEST\u URI
而不是
PHP\u SELF
将包括查询参数(URL中
后面的内容)


并一如既往地使用
filter\u input()
或类似的方法过滤用户输入(包括这些输入)。

谢谢。我正要编辑这个问题,以包括查询字符串。有时页面会登录。php?redirect=例如我的帐户不明白,你能通过编辑在问题中解释它吗?只需维护一个会话。如果用户是loggedIn,则设置会话变量,例如$\u Session['loggedIn']=true;在未登录时需要重定向的所有页面上,在所有页面的顶部检查$\u SESSION['loggedIn']变量。if(session variable!=true){//redirect to signin page,同时设置redirect参数。}我发现有两个脚本直接放在页面上(如下所示),需要确保安全,但我希望所有检查都可以在一个语句中完成,例如if(page='sign-in.php'| page='register.php'))等,并放置在重定向包含,我在页面顶部包括。