Перенаправить все поддомены с 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
.
Примечания:
- HTTP
301
/Redirect permanent
кэшируется навсегда многими DNS-кэшами (т.е. хром)
- Переназначение должно выполняться в
<VirtualHost *:80>
not *:443
, если вы не являетесь владельцем сертификата SSL подстановки.
Ответ 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.
Примечание: эта конфигурация основана на сертификатах подстановочных знаков для поддоменов.