Вопрос или проблема
5 дней назад я создал экземпляр Digital Ocean для установки сайта WordPress. У меня уже есть свой собственный домен, и я создал DNS поддомен blog.example.com
. Сервер работает как на nginx, так и на apache, поэтому мой порт Apache – 8082. Ниже показан мой фактический URL-адрес WordPress:
www.example.com:8082/wordpress/
Несколько вещей, которые я пробовал, приведены ниже.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com:8082/wordpress\
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ([a-z0-9-]+)/? http://$1.example.com [R=301,NC,L]
</IfModule>
Теперь мой ожидаемый результат – это
www.example.com:8082/wordpress\
в
blog.example.com
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com:8082/wordpress\
Переменная сервера HTTP_HOST
содержит значение заголовка HTTP-запроса Host
– это не включает URL-путь (т. е. /wordpress/
). Но почему вы также включили обратный слеш (\
) в конце, вместо (прямого) слеша (/
)? Это просто опечатка? (Хотя вы также перенесли это в пример ниже?)
RewriteRule ([a-z0-9-]+)/? http://$1.example.com [R=301,NC,L]
Не совсем понимаю, какая идея за этим стоит, но эта директива предполагает, что blog
присутствует в запрашиваемом URL-пути – но его нет в вашем примере? И, если только у вас нет нескольких перенаправлений поддоменов, то, похоже, нет необходимости в обобщенном совпадении и замене?
Я бы также задался вопросом, зачем вам условия, которые проверяют, что запрос не сопоставляется с каталогом или файлом. Проверяя, что он не сопоставляется с каталогом, вы не перенаправите /wordpress/
(предполагая, что это физический каталог).
Чтобы перенаправить www.example.com:8082/wordpress/
на blog.example.com
, как в вашем примере (одностороннее перенаправление*1), вам нужно сделать что-то вроде следующего вверху вашего корневого .htaccess
файла:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com:8082
RewriteRule ^wordpress/$ http://blog.example.com/ [R=301,NC,L]
Если файл .htaccess
находится внутри подкаталога /wordpress
, тогда измените RewriteRule
шаблон на ^$
вместо ^wordpress/$
Если example.com:8082
и blog.example.com
указывают на разные области файловой системы, то вы можете полностью удалить условие (RewriteCond
директива).
Нет необходимости в обертке <IfModule>
или директивах RewriteBase
здесь.
*1 Хотя меня удивляет, что вы не хотите массово перенаправить все под-URLs тоже? т. е. Перенаправить www.example.com:8082/wordpress/<something>
на blog.mydomain.com/<something>
. Или вы хотите?
Ответ или решение
Для перенаправления с одного порта на поддомен на вашем сервере, работающем под управлением Apache (в вашем случае на порту 8082), можно использовать файл конфигурации .htaccess
. По вашему вопросу видно, что вы ожидаете перенаправление с URL-адреса www.example.com:8082/wordpress/
на blog.example.com
.
Вот оптимизированное решение для вашего случая, которое решает указанные вами проблемы и обеспечивает необходимое перенаправление.
Настройка файла .htaccess
-
Убедитесь, что
.htaccess
включен: Для начала убедитесь, что в конфигурации Apache разрешено использование файлов.htaccess
. Обычно это настраивается в файле конфигурации вашего виртуального хоста с помощью директивыAllowOverride All
. -
Создайте или измените файл
.htaccess
: Файл.htaccess
должен находиться в корневом каталоге вашего сайта или в каталоге/wordpress
, если вы используете его как подкаталог. Используйте следующий код:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com:8082$ [NC]
RewriteRule ^wordpress/?$ http://blog.example.com/ [R=301,L]
Объяснение кода:
- RewriteEngine On: Включает движок модификации URL.
- RewriteCond: Эта строка проверяет, соответствует ли заголовок
Host
(то есть доменное имя, которое вводит пользователь) тому, что вы ожидаете, т.е.www.example.com:8082
. Используйте флаг[NC]
, чтобы сделать проверку нечувствительной к регистру. - RewriteRule: Эта строка выполняет само перенаправление. Если URL-адрес соответствует шаблону
^wordpress/?$
, перенаправление происходит наhttp://blog.example.com/
. Использование флага[R=301,L]
означает, что это постоянное перенаправление, и оно будет последним правилом, которое выполняется, если условие выполнено.
Дополнительные замечания:
- Перенаправление других URL: Если вы хотите перенаправлять также другие страницы под
/wordpress
, вам нужно модифицировать правило. Например, для перенаправления всех подстраниц можно использовать:
RewriteRule ^wordpress/(.*)$ http://blog.example.com/$1 [R=301,L]
-
Проверка работоспособности: После внесения изменений в
.htaccess
важно проверить перенаправление. Очистите кэш вашего браузера для того, чтобы избежать кэширования старых правил перенаправления. -
Секреты SEO: Постоянные 301 перенаправления помогают сохранить SEO вашего сайта, так как поисковые системы передают "вес" старого URL-адреса новому.
-
Безопасность: Убедитесь, что ваши настройки безопасности и файрвола на сервере не блокируют порты и что DNS-записи для
blog.example.com
корректно указывают на ваш сервер.
Следуя приведённым выше рекомендациям, вы сможете успешно настроить перенаправление на поддомен с нужного порта. Эта настройка не только обеспечит удобный доступ к вашему блогу, но также поможет улучшить структуру URL и SEO вашего сайта.