【问题标题】:PHP: HTTP or HTTPS? [duplicate]PHP:HTTP 还是 HTTPS? [复制]
【发布时间】:2011-05-01 20:58:34
【问题描述】:

如何判断一个 php 页面是通过 http 还是 https 访问的?

【问题讨论】:

  • 如果了解有关您的 PHP 配置的更多信息(例如,它在哪个服务器上运行)会很有用。
  • 以下仅涉及检查 $_SERVER["HTTPS"] 的答案不完整。完整答案请参阅stackoverflow.com/questions/1175096/…

标签: php


【解决方案1】:

如果请求是使用 HTTPS 发送的,您将在 $_SERVER 超全局变量中拥有一个额外的参数 - $_SERVER['HTTPS']。您可以检查它是否已设置

if( isset($_SERVER['HTTPS'] ) ) {

【讨论】:

  • 这种方法的问题在于它并不总是有效,正如$_SERVER 文档所说:“这个数组中的条目是由 Web 服务器创建的。不能保证每个 Web服务器将提供其中任何一个;服务器可能会省略一些,或提供此处未列出的其他内容。"
  • 如果服务器配置正确,应该不是问题。最好先尝试这种方法,如果失败则求助于黑客
  • @EranGalperin,你没有抓住重点。允许正确配置的服务器省略 $_SERVER 条目。它在文档中明确允许。
  • 在某些配置下,$_SERVER['HTTPS'] 在 HTTP 时会返回 'off',因此需要根据 Aelios 的回答进行测试。
  • @Pacerier:现实生活并不像文档中描述的那样工作 - 在任何生产环境中都不会使用省略 $_SERVER['HTTPS'] 的 Web 服务器,这样的行为将被归档为错误,被视为错误并作为错误修复 - 没有人关心文档是否另有说明。
【解决方案2】:

如果您的请求是通过 HTTPS 发送的,您将有一个名为“HTTPS”的额外服务器变量

if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { //HTTPS } 

【讨论】:

  • 在将 ISAPI 与 IIS 结合使用时应使用此答案。
  • 你也可以使用preg_match('/https|HTTPS/',$_SERVER ["REQUEST_SCHEME"]) == 1
  • @jking /https|HTTPS/ 显然忽略了 i 模式修饰符,因为它是更简洁的脚本和最佳实践。
【解决方案3】:
$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,5))=='https'?'https':'http';

$protocol = isset($_SERVER["HTTPS"]) ? 'https' : 'http';

这些都应该工作

【讨论】:

  • 在第二个版本中,HTTPS 必须大写。
【解决方案4】:

这可能会变得更加复杂,具体取决于 PHP 在您的环境中所处的位置,因为您的问题非常广泛。这可能取决于是否有负载均衡器以及它的配置方式。以下是一些相关的问题:

【讨论】:

  • 这些 SO 链接看起来可以像问题下的评论一样轻松发布。
【解决方案5】:
$_SERVER['HTTPS']

如果请求是通过 HTTPS 发送的,这将包含一个“非空”值

PHP Server Variables

【讨论】:

    【解决方案6】:

    您应该可以通过检查 $_SERVER['HTTPS'] 的值来做到这一点(它应该只在使用 https 时设置)。

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

    【讨论】:

    • 所以如果我使用 HTTPS 并且服务器没有创建这个 $_SERVER['HTTPS'] 是否意味着它是假的 HTTPS?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2012-01-22
    • 2011-08-23
    相关资源
    最近更新 更多