為什麼 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 無法確定網站是否在安全連線上運作。

配置

我正在運行一個比特奈米燈堆。據我所知,伺服器不運行反向代理。該網站確實配置了 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

虛擬主機配置:

<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)。前者應將流量重定向到後者。如果您確保以 :80 結尾的 VIRTUALHOST 網站(我認為您實際使用的網站)具有與以 :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>

相關內容