RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
Это не будет работать, если используется в файле .htaccess
в подкаталоге (сайт B), например. /traveltour/.htaccess
, так как это приведет к тому, что пользователь будет перенаправлен обратно на сайт A в root. Захваченная обратная ссылка $1
не будет содержать подкаталог. Вместо этого вам нужно будет использовать серверную переменную REQUEST_URI
, чтобы использовать полный URL-путь (как вы делаете в третьем блоке кода).
Также обратите внимание, что SERVER_NAME
может не содержать желаемого значения - в зависимости от вашей системы. По умолчанию SERVER_NAME
совпадает с HTTP_HOST
(значение заголовка HTTP-запроса Host
, ie. Запрашиваемое имя хоста), однако, если в конфигурации сервера установлено UseCanonicalName On
, то вместо этого это будет быть значением имени хоста, установленным в директиве ServerName
. Это может быть не www or www domain или что-то еще полностью (если у вас несколько доменов). Поэтому, не зная вашей системы, использование SERVER_NAME
здесь не обязательно является надежным / обобщенным решением.
Например, в /B/.htaccess
, до фронт-контроллера WordPress:
# Redirect HTTP to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# BEGIN WordPress
:
Что в основном совпадает с вашим 3-м кодовым блоком. Оболочка <IfModule>
не требуется и должна быть опущена. Вам также не нужно повторять директиву RewriteEngine On
(что происходит позже в файле - внутри блока кода WordPress).
В файле root /.htaccess
(сайт A), вы можете использовать те же директивы, что и выше, ИЛИ версию с перехватом обратной ссылки - это не имеет значения в этом контексте.
Обратите внимание, однако, что это только перенаправление HTTP на HTTPS, оно не канонизировать www subdomain. (Это обычно обрабатывается самим WordPress путем установки правильных значений WP_SITEURL
и WP_HOME
в wp-config.php
.) Для обработки этого в .htaccess
вы можете изменить приведенное выше правило следующим образом:
# Redirect HTTP to HTTPS and non-www to www
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]
Это предполагает, что у вас нет других поддоменов, которые должны быть доступны, поскольку все перенаправлено на www.
Если вы хотите «обобщенное» решение, которое явно не упоминает имя домена (хотя это не обязательно лучший вариант - зависит от вашей системы), тогда вы можете сделать что-то вроде этого:
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L]
Обратная ссылка %1
соответствует запрошенному имени хоста l ess префикс www.
(если есть).
Опять же, это будет работать как в файлах /.htaccess
, так и /B/.htaccess
.
Сначала необходимо протестировать с 302 (временными) перенаправлениями чтобы избежать потенциальных проблем с кэшированием. И перед тестированием вам необходимо будет очистить кэш браузера. 301s постоянно кэшируется браузером, поэтому тестирование может быть проблематичным c.