Система: 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>
Глупый: проблема была вне сервера! Я не настраивал субдомен 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.