-1

我需要一个 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上。

任何帮助表示赞赏

4

5 回答 5

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,它是一个包含标题、路径和脚本位置等信息的数组。

于 2013-03-19T21:19:23.297 回答
0

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

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

于 2013-03-19T21:18:57.473 回答
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。重要的是确保应该安全的页面是安全的,而不是确保不需要安全的页面不安全。

于 2013-03-19T21:31:27.370 回答
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 提供任何目录等以获取正确的路径) .

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

301 永久移动也将防止任何负面的 SEO。

于 2015-12-02T09:59:30.740 回答
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将包括查询参数(?在 URL 之后的东西)。

并且一如既往地使用filter_input()或类似过滤您的用户输入(包括这些)。

于 2016-12-05T19:04:02.587 回答