Назад | Перейти на главную страницу

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

У меня есть следующие файлы conf:

file1:

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 по умолчанию.

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

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

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

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

<Virtualhost *:80>
ServerAdmin webmaster@site.com
ServerName site.com
ServerAlias site.com www.site.com

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

Это работает как шарм, и вам больше не нужна никакая конфигурация или какой-либо дополнительный модуль.

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

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

У меня была такая же проблема с apache 2.4 на centos 7, и исправление, которое сработало для меня без использования RewriteEngine, заключалось в добавлении : 443 в директиву ServerName в VirtualHost для https.

<VirtualHost 123.45.67.890:443>
DocumentRoot "/opt/www/example-docroot"
ServerName example.com:443

Я думаю, что в прошлый раз это случилось со мной, это могло быть что-то странное, например NameVirtualHost *:80/NameVirtualHost *:443 и / или Listen 80/Listen 443 были где-то кроме ports.conf для apache2.

Вот то, что у меня есть в VirtualHost для перенаправления на https для всех страниц, кроме прессы (было видео, которое не могло быть обслужено https, поэтому пришлось перенаправить обратно на http, иначе люди получили бы уродливые предупреждения о том, что страница небезопасна):

<VirtualHost *:80>
    ServerName example.com
    RewriteEngine On

    RewriteCond %{REQUEST_URI} !^/press/.*
    RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NC]
</VirtualHost>

Я только что нашел эту ссылку сегодня, возможно, это поможет: http://www.serveridol.com/2012/09/24/apache-forcing-all-url-to-https-on-www-domain/

RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{SERVER_NAME}/$1