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

htaccess - перенаправление без https и установка разных страниц по умолчанию для каждого поддомена

У меня есть ssl-код подстановки для моего домена. У меня много поддоменов, каждый со своей страницей по умолчанию.

www.domain.com/main.html [/home/domain/main.html]
try.domain.com/free.php [/home/domain/try/free.php]
new.domain.com/signup.php [/home/domain/new/signup.php]
и т.д

Я хочу написать .htaccess так, чтобы:

  1. Весь трафик направляется на https
  2. Поддомены разрешаются на соответствующие страницы по умолчанию
  3. Все, кроме www, направляются на www, за исключением субдоменов, которые остаются subdomain.domain.com

Я хочу сделать все это в одном файле htaccess /home/domain/.htacces и не иметь файлов htaccess в каждой папке.

ИМХО, вы уже идете в неправильном направлении с намерением создать .htaccess файл, который является моей любимой головной болью, цитируется из руководство по .htaccess файлы:

Вам следует избегать использования .htaccess файлы полностью если у вас есть доступ к конфигурации главного сервера httpd файл. С помощью .htaccess файлы замедляют ваш http-сервер Apache. Любая директива, которую вы можете включить в .htaccess файл лучше установить в Directory блок в основном файле (файлах) конфигурации Apache, так как он будет иметь тот же эффект с лучшей производительностью.

Настройте VirtualHost по умолчанию / catchall на порту 80 для простого HTTP для перенаправления всего на ваши безопасные хосты:

<VirtualHost :80>
  Servername www.example.com
  ServerAlias *.example.com
  # https://wiki.apache.org/httpd/RewriteHTTPToHTTPS
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R,L]

  >other optional directives<
</VirtualHost>

Вышеупомянутое сохранит имя хоста при перенаправлении на SSL.

Тогда гораздо более эффективная конфигурация - использовать тот факт, что у вас есть сертификат SSL с подстановочными знаками (и вам даже не нужно зависеть от SNI) и создайте виртуальный хост имени для каждого из ваших поддоменов, с последним всеобъемлющим, что для любого субдомена, который явно не определен, перенаправляет на www

<VirtualHost *:443>
        SSLEngine on
        >>other optional and required (SSL) directives<<
        SSLCertificateFile      /etc/ssl/star.example.com.crt
        SSLCertificateKeyFile   /etc/ssl/star.example.com.key
        ServerName      "one.example.com"
        DocumentRoot    "/var/www/html/one"
</virtualHost>
<VirtualHost *:443>
        SSLEngine on
        >>other optional and required (SSL) directives<<
        SSLCertificateFile      /etc/ssl/star.example.com.crt
        SSLCertificateKeyFile   /etc/ssl/star.example.com.key
        ServerName      "two.example.com"
        DocumentRoot    "/var/www/html/two"
</virtualHost>
<VirtualHost *:443>
        SSLEngine on
        >>other optional and required (SSL) directives<<
        SSLCertificateFile      /etc/ssl/star.example.com.crt
        SSLCertificateKeyFile   /etc/ssl/star.example.com.key
        ServerName      "www.example.com"
        DocumentRoot    "/var/www/html/www"
</virtualHost>

# Use the fact that the configuration file is parsed in order
# and make this catch-all entry only catch what isn't defined above:
<VirtualHost *:443>
        SSLEngine on
        >>other optional and required (SSL) directives<<
        SSLCertificateFile      /etc/ssl/star.example.com.crt
        SSLCertificateKeyFile   /etc/ssl/star.example.com.key
        ServerName      "star.example.com"
        ServerAlias      *.example.com
        Redirect / https://www.example.com
</virtualHost>

Или, если вам нужны минимальные конфигурации: mod_vhost_alias может быть интересно.