Apache перенаправление с http на https не работает

Apache перенаправление с http на https не работает

У меня есть следующие файлы конфигурации:

файл1:

NameVirtualHost  123.45.67.890:80

<VirtualHost 123.45.67.890:80>
    ServerName example.com

    RedirectPermanent / https://example.com/

#   RewriteEngine On
#   RewriteCond %{SERVER_PORT} !^443$
#   RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R]

#   SSLRequireSSL
#   Redirect permanent /secure https://example.com/

#   Redirect / https://example.com/
</VirtualHost>

Как вы можете видеть из закомментированных строк, я перепробовал несколько подходов.

файл2:

NameVirtualHost 123.45.67.890:443

<VirtualHost 123.45.67.890:443>
    DocumentRoot "/opt/www/example-docroot"
    ServerName example.com
    DirectoryIndex index.html
    SSLEngine on

    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile /etc/httpd/conf.d/ssl/example.com/csr.example.2011.pem.blade
    SSLCertificateKeyFile /etc/httpd/conf.d/ssl/example.com/nokey.example.2011.pem
    SSLCACertificateFile /etc/httpd/conf.d/ssl/example.com/CA.blade.2011.csr

    <Files ~ "\.(cgi|shtml|phtml|php3?)$">
        SSLOptions +StdEnvVars
    </Files>
    <Directory "/etc/httpd/cgi-bin">
        SSLOptions +StdEnvVars
    </Directory>
</VirtualHost>

Некоторые вещи удалены для простоты, имена изменены для защиты невиновных.

Я обновляю эти файлы на сервере /etc/httpd/vhosts

затем беги

apachectl restart

Что дает мне следующие предупреждения:

[warn] NameVirtualHost 123.45.67.890:80 has no VirtualHosts
[warn] NameVirtualHost 123.45.67.890:80 has no VirtualHosts

У нас есть несколько виртуальных хостов, запущенных с этого сервера. Вышеуказанные конфигурации, похоже, выровнены, поэтому я не думаю, что эти предупреждения применимы здесь. Может быть, это неправильно.

При обновлении страницы по умолчанию 80 (http) в моем браузере всегда отображается страница по умолчанию http.

Есть ли у вас предложения, как заставить работать перенаправление?

решение1

Многие примеры работают на определенных конфигурациях. Этот работает всегда, независимо от того, какую конфигурацию использует ваш сервер Apache:

RewriteEngine On
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(/(.*))?$ https://%{HTTP_HOST}/$1 [R=301,L]

решение2

Я столкнулся с точно такой же проблемой несколько дней назад. Я попробовал следующее в конфигурации VirtualHost (применимо к http-порту 80) в файле apache httpd.conf, и это сработало.

<Virtualhost *:80>
ServerAdmin [email protected]
ServerName site.com
ServerAlias site.com www.site.com

RedirectMatch permanent ^(.*)$ https://www.site.com$1
</Virtualhost>

Это работает просто великолепно, и вам не нужно никаких дополнительных настроек или модулей.

решение3

Лучше использовать .htaccessдля этого (если возможно), не нужно возиться с файлами конфигурации apache. Добавьте эти строки в начало вашего .htaccess.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

решение4

Наша проблема была в приоритете файла конфигурации. Короче говоря, HTTP VirtualHost 000-default.confпереопределял настройки, которые мы создали в нашем собственном файле конфигурации.

Это сбивает с толку любого, кто знает значение слова "default", которое означает что-то, используемое только если оно не определено в другом месте. Мы глупо предположили, что это 000-default.confобеспечит конфигурацию только если она не была определена в другом файле конфигурации.

Мы ошибались. Apache просто использует конфигурацию в первом файле, который он встречает, основываясь на имени файла в алфавитно-цифровом порядке. Он переходит к следующему файлу, если не может найти соответствующий VirtualHost в этом файле, что вызывает забавную путаницу, если вы не знаете, как это работает, но довольно аккуратно, как только вы это поймете.

Связанный контент