Php

為什麼 Apache 不向 PHP 報告 HTTPS?

  • October 26, 2015

問題

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

虛擬主機配置:

<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>

在我看來,你實際上是通過 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>

引用自:https://serverfault.com/questions/729369