Перенаправить все поддомены с http на https

Я перенаправляю все http-запросы для моего поддомена на https, используя следующий код.

<VirtualHost *:80>
  ServerName subdomain.example.com
  Redirect 302 / https://subdomain.example.com
</VirtualHost>

Теперь моя проблема в том, как это сделать для всех поддоменов.

Например, http: subdomain1.example.com следует перейти на https: subdomain1.example.com и http: subdomain2.example.com следует перейти на https: subdomain2.example.com

Как это сделать для всех поддоменов без необходимости создавать один виртуальный хост для всех из них

Обновление

Я обнаружил, что RedirectMatch принимает регулярное выражение. Кто-нибудь знает, как это сделать с помощью регулярного выражения?

Ответ 1

Вы можете добавить это в ваш файл .conf сервера:

<VirtualHost *:80>
  ServerName subdomain.example.com
  ServerAlias *.example.com

  RewriteEngine On
  RewriteCond %{HTTP_HOST} ^(.+)\.example\.com$
  RewriteRule ^(.*)$ https://%1.example.com$1 [R=302,L]
</VirtualHost>

ServerAlias позволит виртуальному хосту выступать в качестве подстановочного знака, затем вы можете извлечь поддомен из заголовка хоста и включить их в перезапись на https

Ответ 2

Вот более простая универсальная модификация файла .conf:

<VirtualHost *:80>
    #...whatever you already have set up...

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(.*)$ [NC]
    RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]

</VirtualHost>

Ответ 3

Если он должен соответствовать всем субдоменам, но не определенным, используйте его, после того, как я натолкнулся после многих недель борьбы (на основе автоматически сгенерированного кода certbot):

<VirtualHost *:80>
    ServerName example.com
    ServerAlias *.example.com

    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP_HOST} !^api.example.com [NC]
    RewriteRule ^ https://example.com%{REQUEST_URI} [L,QSA,R]
</VirtualHost>

Объяснение:
ServerAlias *.example.com требуется, в противном случае поддомены будут обрабатываться виртуальным хостом по умолчанию apache.

%{HTTP_HOST} !^api.example.com пользователь, введенный/запрошенный имя хоста, не (!^) соответствует указанному имени хоста.

[NC] не чувствителен к регистру. Итак api, api, api и т.д. Все совпадают (одинаково для 2-го и верхнего уровня).

[L,QSA,R]
L Последнее правило (в этом контексте).
QSA с этим, .com?index.php&page=1 станет .com?index.php
R по умолчанию используется R=302, который является кодом перенаправления HTTP для Found (перемещается временно).

Второй RewriteCond не требуется, если субдомен VirtualHost определен раньше/выше/в алфавитном порядке (если у вас есть файл .conf для домена/поддомена). Но безопасно иметь его в любом случае.

Если в конце строки RewriteCond нет [OR], то существует неявный логический AND.

Примечания:

Ответ 4

Как говорится в записи Apache Wiki для RewriteHTTPToHTTPS,

Использование mod_rewrite для этого не рекомендуется. Смотрите RedirectSSL

Конфигурация vhost для принудительного перенаправления HTTP на HTTPS, которая также работает с поддоменами, такова:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias *.example.com

    <Location "/">
        Redirect permanent "https://%{HTTP_HOST}%{REQUEST_URI}"
    </Location>
</VirtualHost>

<VirtualHost *:443>
    [...your vHost configuration...]
    SSLEngine On
    SSLCertificateFile /path/to/your/cert.pem
    SSLCertificateKeyFile /path/to/your/privkey.pem
</VirtualHost>

Объяснение: Redirect и RedirectMatch обычно не имеют переменных (например, {HTTP_HOST}) из Mod_Rewrite, но если вы используете <Location > эти переменные будут назначены.

Redirect permanent (Альтернатива: Redirect 301) будет перенаправлено с кодом http 301, потому что

Перенаправление 301 считается лучшей практикой для обновления пользователей с HTTP на HTTPS.

Примечание: эта конфигурация основана на сертификатах подстановочных знаков для поддоменов.