為什麼 Apache 不向 PHP 報告 HTTPS?
問題
Apache 沒有在
$_SERVER
PHP 的變數中報告 HTTPS。證書根據sslcheck.nl正確配置,並且網站將每個 HTTP 請求重定向到 HTTPS 等效項。
$_SERVER
多變的:
HTTPS
密鑰不存在SERVER_PORT
是 80 而不是 443HTTP_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>