【问题标题】:php.ini show server https protocol [duplicate]php.ini 显示服务器 https 协议 [重复]
【发布时间】:2016-01-10 11:11:10
【问题描述】:

我想检测用户是通过 http 还是 https 导航 并在网站的某些区域切换到 https。问题是 我的服务器不显示 $_SERVER['HTTPS'] 所以我想我会 必须配置 php.ini 才能显示它。

我似乎无法弄清楚,要在 php 上更改哪些值 ini 来证明这一点。

谢谢。

编辑:我不是想找到检测 https 使用的替代方法。 我在问如何编辑 php.ini 以便显示 $_SERVER['HTTPS'] 我访问 https://

时的值

Edit2:可能还不够清楚。 $_SERVER['HTTPS'] 根本不存在

更新/回答: 感谢@Sheriff 我放了

fastcgi_param   HTTPS               on;
fastcgi_param   HTTP_SCHEME         https;

在我的虚拟主机文件的这个块内 位置 ~ .php$ { }

现在 $_SERVER 显示

[HTTPS] => on
[HTTP_SCHEME] => https

以前它不起作用,因为我把 fastcgi 参数值 在服务器块中。傻我。

【问题讨论】:

  • $_SERVER['HTTPS'] 仅在通过安全套接字层 (SSL) 连接访问服务器时显示
  • 是的,我通过 https 访问过它仍然没有显示。
  • @bornie 并非所有服务器都填充HTTPS 元素。最好检查一下是否通过端口 443 访问该站点。所使用的端口几乎总是被填充。
  • 是的,但是“$_SERVER['SERVER_PORT'] 可能会很棘手...例如 ispconfig 使用端口 81 作为安全端口”
  • 您使用的是什么网络服务器?正如@iam-decoder 指出的那样,并非所有服务器都填充该元素。在 Apache 中,这将是 SetEnv HTTPS on

标签: php https


【解决方案1】:

$_SERVER['HTTPS'] 没有 php.ini 配置。如果请求是通过 HTTPS 发出的,则此键设置为 非空。意思是,if (!empty(filter_var($_SERVER['HTTPS'], FILTER_VALIDATE_BOOLEAN))) { /* request was made over https */ }

更多详情请见the manual...

'HTTPS'

如果脚本是通过 HTTPS 协议查询的,则设置为非空值。

注意:

请注意,在将 ISAPI 与 IIS 结合使用时,如果请求不是通过 HTTPS 协议发出的,则该值将为 off

当此值为"0""false""off""no"""NULL 时,filter_varFILTER_VALIDATE_BOOLEAN 将返回布尔值false

记住

同样重要的是要记住,PHP 仅从它通过 SAPI(服务器 API)获得的信息中填充$_SERVER['HTTPS'],它用于与您的 Web 服务器软件进行通信。所以这可能是 mod_php 或 fcgi 等... 通常,这些数据是从 PHP 通过 SAPI 从您的 Web 服务器复制的环境变量中填充的。默认情况下,当通过 HTTPS 建立连接时,Apache httpd 包含 HTTPS 环境变量,但是如果您使用fastcgi_pass,nginx 将。您需要通过修改您的 nginx 配置为HTTPS 设置一个fastcgi_param 来自己配置它。这将允许 nginx 通过 fastcgi 通知 php-fpm 环境变量,它可以相应地填充到您的 PHP 中。

还要注意,如果您使用 nginx 作为反向代理,这可能会变得更加复杂,因为反向代理也必须以相同的方式将信息传递给代理节点。

重要提示

但是,您应该注意,默认情况下使用 PHP 重定向到 HTTPS 可能是个坏主意。最好配置您的网络服务器来执行此操作。

例如,in Apache httpd you can configure your VHOST to redirect all HTTP traffic to HTTPS by default,如果您碰巧在某些 PHP 端点中忘记了这一点,它可能会更安全、更容易。这是假设您的意图是在您的整个站点或某些特定域中强制执行 HTTPS。

【讨论】:

  • 是的,我知道这一点。但我不介意网站的其他部分是 http。我只想要登录页面上的 https。
  • 您的 if {} 块代码在我的服务器中不起作用。我放了一个回声“https访问”;在 if 块内查看 php 是否会检测到但没有
  • 您使用的是什么网络服务器软件?例如Apache httpd 与 mod_php,nginx 与 php-fpm 等等..?
  • 嗨谢里夫,nginx php-fpm
  • 这就解释了。当您使用fastcgi_pass 时,Nginx 默认不会将该变量传递给 PHP-FPM 守护进程,为了让 PHP-FPM 了解您的 HTTPS 设置,您需要在配置中添加一个 fastcgi_param 环境变量。例如,在您的 443 vhost 配置中,您可以添加类似 fastcgi_param HTTPS 'on'; 的内容以在 PHP 中获取 $_SERVER['HTTPS']
猜你喜欢
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2020-05-25
  • 2012-08-23
相关资源
最近更新 更多