为什么 Apache 没有向 PHP 报告 HTTPS?

为什么 Apache 没有向 PHP 报告 HTTPS?

问题

Apache 没有在$_SERVERPHP 变量中报告 HTTPS。证书已根据以下说明正确配置sslcheck.nl网站会将每个 HTTP 请求重定向到等效的 HTTPS 请求。

$_SERVER多变的:

  • HTTPS密钥不存在
  • SERVER_PORT是 80,而不是 443
  • HTTP_X_FORWARDED_PROTO未设置
  • REQUEST_SCHEME是 http 而不是 https

如果没有这些值,Symfony 框架和 Wordpress 就无法确定网站是否在安全连接上运行。

配置

我正在运行Bitnami LAMP堆栈。据我所知,服务器没有运行反向代理。该网站确实配置了 mod_pagespeed,但我不认为这是配置为反向代理。我尝试为测试虚拟主机禁用 mod_pagespeed,但 Apache 一直报告 http。

Apache 错误报告 HTTP/HTTPS 还可能有哪些原因?

更新

输出自netstat -plnt

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      65034/master
tcp        0      0 127.0.0.1:2812          0.0.0.0:*               LISTEN      2295/monit
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1801/mysqld.bin
tcp        0      0 127.0.0.1:12301         0.0.0.0:*               LISTEN      48346/opendkim
tcp        0      0 127.0.0.1:21            0.0.0.0:*               LISTEN      731/vsftpd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1889/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      65034/master
tcp6       0      0 :::443                  :::*                    LISTEN      25401/httpd
tcp6       0      0 :::80                   :::*                    LISTEN      25401/httpd
tcp6       0      0 :::22                   :::*                    LISTEN      1889/sshd

Vhost配置:

<VirtualHost *:80>
  ServerName mydomain.com

  DocumentRoot "/opt/bitnami/apps/mydomain/htdocs/web"

  RewriteEngine On

  #redirect non-www to https://www.
  RewriteCond %{HTTP_HOST} !^www\. [NC]
  RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

  #redirect http://www. to https://www.
  RewriteCond %{HTTPS} !=on
  RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R,L]

  CustomLog /opt/bitnami/apache2/logs/mydomain-http.log combined

  Include "/opt/bitnami/apps/mydomain/conf/httpd-app.conf"
</VirtualHost>

<VirtualHost *:443>
  ServerName mydomain.com

  DocumentRoot "/opt/bitnami/apps/mydomain/htdocs/web"

  RewriteEngine On
  RewriteCond %{HTTP_HOST} !^www\. [NC]
  RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

  CustomLog /opt/bitnami/apache2/logs/mydomain-https.log combined

  SetEnv HTTPS on #Added this to force https environment variable

  Include "/opt/bitnami/apps/mydomain/conf/httpd-app.conf"
</VirtualHost>

答案1

在我看来,您实际上是通过 HTTP 而不是 HTTPS 访问 apache(它告诉您这一点)。

如果您检查 apache 配置文件,您应该有 2 个站点,一个用于 :80 (HTTP),另一个用于 :443 (HTTPS)。前者应该将流量重定向到后者。如果您确保 VIRTUALHOST 以 :80 结尾的站点(我认为您实际正在使用)具有与以 :443 结尾的站点(您认为您正在使用的 HTTPS 主机)不同的日志文件,那么您将能够查看日志文件,以确定您正在查看哪个站点。

有可能某些东西正在将未包装的 HTTP 对话通过隧道传输到 apache,并管理 SSL 部分,但查看了 bitnampi 文档后,他们并没有这样做,因此您必须自己设置类似 stunnel 的东西。正如 Hakan Lindqvist 所说,如果 netstat -lpn 仅显示 apache 在 :443 和 :80 上监听,那么真相一定在 apache 配置文件中。正如我上面提到的,我建议配置日志以确保万无一失,但一般来说,如果它看起来像鸭子,叫声像鸭子,喜欢在池塘里消磨时光,在雨中游泳,那么首先假设它是鸭子,因为它不太可能是猫。

你可能会发现这很有帮助:https://wiki.bitnami.com/Components/Apache#How_to_enable_HTTPS_support_with_SSL_certificates

值得注意的是,这是一个示例 HTTPS 站点配置(来自上面的链接) <VirtualHost *:443> SSLEngine on DocumentRoot "/opt/bitnami/apps/sugarcrm/htdocs" ServerName my-sugarcrm.example.com SSLCertificateFile "/opt/bitnami/apache2/conf/my-sugarcrm.crt" SSLCertificateKeyFile "/opt/bitnami/apache2/conf/my-sugarcrm.key" </VIrtualHost>

相关内容