.htaccess к WWW И/Или HTTPS
На своем сайте я хочу сделать следующие перенаправления:
-
http[s]://example.com
=>https://www.example.com
-
https://www.example.com
=>No Redirect
-
http://sub.example.com
=>https://sub.example.com
-
http[s]://www.sub.example.com
=>https://sub.example.com
Я перепробовал много методов, но все они перенаправили http://sub.example.com
на https://www.sub.example.com
. Что затем приведет к "DNS не найден" Или перенаправит на поиск по внезапной ссылке.
1 answers
Все они перенаправлены
http://sub.example.com
Кhttps://www.sub.example.com
Это, по-видимому, предполагает, что у вас есть правило, которое просто проверяет отсутствие www
(что верно для первого правила, но противоречит второму), а затем добавляет префикс к запрошенному хосту .
Я предполагаю, что вы также хотите перенаправить http://example.com/<something>
на https://www.example.com/<something>
и т.д.?
Попробуйте выполнить следующее в верхней части вашего файла .htaccess
:
RewriteEngine On
# www.example.com
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{HTTP_HOST} !(www\.)?sub\.example\.com
RewriteRule (.*) https://www.example.com/$1 [R=301,L]
Это в основном гласит... для всех запросы, которые являются HTTP (т. е. не HTTPS) ИЛИ предназначены для example.com
И не предназначены для sub.example.com
(или www.sub.example.com
), а затем перенаправляют на https://www.example.com/...
.
Затем добавьте аналогичный блок правил для канонизации поддомена:
# sub.example.com
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} ^www\.sub\.example\.com [NC]
RewriteCond %{HTTP_HOST} !(www\.)?example\.com
RewriteRule (.*) https://sub.example.com/$1 [R=301,L]
Убедитесь, что вы очистили кэш браузера перед тестированием, так как ваши предыдущие (ошибочные) перенаправления 301 будут кэшированы. (По этой причине часто бывает проще тестировать с 302s.)
ОБНОВЛЕНИЕ: могу ли я сделать подстановочный знак на поддомен?
Поддомен из 1 или более символов...
# www.example.com (wildcard subdomain)
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{HTTP_HOST} !(www\.)?[a-z0-9-]+\.example\.com
RewriteRule (.*) https://www.example.com/$1 [R=301,L]
# <any-subdomain>.example.com
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} ^www\.[a-z0-9-]+\.example\.com [NC]
RewriteCond %{HTTP_HOST} !(www\.)?example\.com
RewriteCond %{HTTP_HOST} ^(?:www\.)?([a-z0-9-]+)\.example\.com [NC]
RewriteRule (.*) https://%1.example.com/$1 [R=301,L]
Дополнительная директива RewriteCond
для блока поддомена требуется для захвата поддомена, чтобы мы могли использовать это в RewriteRule
замена (%1
обратная ссылка). (?:www\.)?
часть шаблона является группой без захвата, которая делает www
поддомен необязательным, так как нам нужно иметь возможность перенаправлять sub.example.com
(HTTP) или www.sub.example.com
(HTTP или HTTPS).
%1
обратная ссылка в RewriteRule
подстановка соответствует первой захваченной группе в последнем сопоставленном условном шаблоне.