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

перенаправить постоянный http на https

Система: Ubuntu 14.04, Apache 2.4.7

Я хочу, чтобы все запросы http://domain.com и https://domain.com быть перенаправленным на https://domain.com. Я также хочу перенаправить запросы на субдомен "www" на главный хост domain.com, в то время как несколько других субдоменов (tools.domain.com и phpmyadmin.domain.com) будут доступны через http на данный момент.

Все это нужно делать напрямую через конфигурационный файл виртуального хоста для domain.com, (/etc/apache2/sites-available/domain.com.conf полный контент здесь ниже), затем несколько раз перезапустил службу apache2.

Перенаправление с http://domain.com к https://domain.com работает. Перенаправление с http://www.domain.com к https://domain.com не работает. Перенаправление с https://www.domain.com к https://domain.com не работает.

Вот содержимое файла виртуального хоста:

<VirtualHost *:*>
    ServerName www.domain.com
    Redirect permanent / https://domain.com/
</VirtualHost>

<VirtualHost _default_:80>
    ServerName domain.com
    Redirect permanent / https://domain.com/
    LogLevel error
</VirtualHost>

<VirtualHost *:80>
    ServerName tools.domain.com
    DocumentRoot /var/www/domain.com/subdomains/tools/public
</VirtualHost>

<VirtualHost *:80>
    ServerName phpmyadmin.domain.com
    DocumentRoot /usr/share/phpmyadmin
</VirtualHost>

<VirtualHost _default_:443>
    ServerName domain.com

    DocumentRoot /var/www/domain.com/public

    <Directory /var/www/domain.com/public>
        Require all granted
    </Directory>

    # SSL CERTIFICATES
    GnuTLSEnable on
    GnuTLSExportCertificates on
    GnuTLSCacheTimeout 500
    GnuTLSCertificateFile /etc/ssl/certs/domain.com-certificate-125023.crt
    GnuTLSKeyFile         /etc/ssl/private/domain.com.key
    GnuTLSPriorities      NORMAL
</VirtualHost>

Обновление: только https://www.domain.com не работает

Глупый: проблема была вне сервера! Я не настраивал субдомен www в своей зоне DNS. Я исправил это, и теперь я почти готов.

Вы пробовали использовать mod_rewrite? Вы можете сделать то же самое с помощью следующего правила mod_rewrite.

RewriteCond %{SERVER_PORT} 80 [OR,NC]
RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ https://domain.com/$1 [R=301,L]

_default_ означает по умолчанию

С такой конфигурацией:

<VirtualHost _default_:80>
    ...
</VirtualHost>

<VirtualHost _default_:443>
    ...
</VirtualHost>

<VirtualHost *:*>        
    ...
</VirtualHost>

Последний виртуальный хост недоступен на портах 80 и 443, поскольку любой запрос на этих портах будет обрабатываться соответствующими _default_ виртуальный хост. В *:* виртуальный хост, вероятно, вообще не требуется (ожидаете ли вы, что публичные пользователи будут использовать больше портов ??).

Рабочий пример

Поэтому, чтобы все перенаправлялось на https://example.com вам нужно, например:

<VirtualHost *:443>
    ServerName example.com

    # SSL config

    ...
</VirtualHost>

<VirtualHost *:80>
    RewriteEngine On
    RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost *:443>

    # SSL config

    RewriteEngine On
    RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]
</VirtualHost>

Обратите внимание на использование правила перезаписи для захвата всего, так как при использовании только перенаправления совпадают один URL.