Почему Apache не сообщает о HTTPS в PHP?
проблема
Apache не сообщает HTTPS в $_SERVER
переменная PHP. Сертификат правильно настроен в соответствии с http://www.sslcheck.nl/, и веб-сайт перенаправляет каждый HTTP-запрос в HTTPS-эквивалент.
$_SERVER
переменная:
HTTPS
ключ не существуетSERVER_PORT
80 вместо 443HTTP_X_FORWARDED_PROTO
не установленREQUEST_SCHEME
это http вместо https
Без этих значений Symfony Framework и 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 ответ
Мне кажется, что вы на самом деле обращаетесь к apache через HTTP, а не HTTPS (что вам и говорит).
Если вы проверите свой конфигурационный файл apache, у вас должно быть 2 сайта, один для:80 (HTTP) и один для:443 (HTTPS). Первый должен перенаправлять трафик на последующие. Если вы убедитесь, что у сайта с VIRTUALHOST, заканчивающимся: 80 (что, я думаю, вы на самом деле используете), есть файл журнала, отличный от того, который заканчивается: 443 (который является хостом HTTPS, который, по вашему мнению, вы используете), то вы сможете просматривать файлы журналов, чтобы убедиться, на каком сайте вы просматриваете.
Вполне возможно, что что-то туннелирует HTTP-разговор без развертки в apache, управляя частью SSL, но, взглянув на документы bitnampi, они этого не делают, поэтому вам придется настроить что-то вроде stunnel самостоятельно. Как сказал Хакан Линдквист, если netstat -lpn показывает только прослушивание apache: 443 и:80, то истина должна быть в конфигурационном файле apache. Как я уже упоминал выше, я предлагаю настроить журналы, чтобы быть уверенным, но обычно, если он выглядит как утка, крякает как утка и любит проводить время в прудах, купаться в дожде, сначала работать на предположении, это утка как это вряд ли будет кошкой.
Вы можете найти это полезным: https://wiki.bitnami.com/Components/Apache
Стоит отметить, что это пример конфигурации сайта 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>