如果页面是PHP,PHP重定向到HTTPS

时间:2013-03-19 21:17:42

标签: php

我需要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-account但是,我希望该页面重定向到https://domain.com/sign-in.php?redirect=my-account

我知道我可以简单地将标题重定向更改为包含https而不是http,但用户可以输入http://domain.com/sign-in.php?redirect=my-account,因此只需要确保是否会发生这种情况(或其他)通过https发生。

感谢任何帮助

5 个答案:

答案 0 :(得分: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,它是一个包含标题,路径和脚本位置等信息的数组。

答案 1 :(得分:0)

您可以检查$ _SERVER,特别是'SERVER_PROTOCOL'

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

答案 2 :(得分: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上冲浪,通常无关紧要。事实上,谷歌的大多数服务都采用HTTPS,并且通过更好的互联网连接,冲浪最终将全部通过HTTPS完成。确保应该安全的页面是安全的,而不是确保不需要安全的页面不是很重要。

答案 3 :(得分:0)

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提供任何dirs等等以获取正确的路径)。

在单页上使用(例如登录和注册) - 这会将用户重定向到SSL中的此页面(将此代码放在顶部附近)。

301 Moved Permanently也会阻止任何负面的SEO。

答案 4 :(得分:0)

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

确定是否使用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将包含查询参数(网址中?之后的内容)。

并始终使用filter_input()等过滤您的用户输入(包括这些)。