Я пытался несколько часов и уже немного нервничаю по этому поводу, поэтому я, вероятно, не вижу очевидное.
У меня два сайта WordPress: один - моя «главная» страница, которую люди видят, когда заходят в корень моего домена, а другой - частный блог:
www.example.com
и www .example.com / blog
В корневом каталоге моего сервера я хотел бы разместить обе страницы в отдельных папках, чтобы они были чистыми. Эти папки я назвал wp-main
и wp-blog
. Чтобы перенаправить домены, я начал возиться с .htaccess
, но, похоже, не могу понять это правильно - blog
является проблемой. main
отлично работает с инструкциями из здесь , но блог не загружает тему WordPress (отображает необработанное содержимое) и не перенаправляет ни в какие подпапки. Если я уберу правила перенаправления для main
, индекс блога загрузится, но перенаправление вложенных папок все равно не будет.
Кто-нибудь может мне помочь?
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
## redirect for main
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/wp-main($|/)$
RewriteCond %{REQUEST_URI} !^/blog($|/)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /wp-main/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ wp-main/index.php
## redirect for blog
RewriteRule ^blog(.*)$ /wp-blog/$1
</IfModule>
RewriteCond% {REQUEST_URI}! ^ / Wp-main ($ | /) $ RewriteCond% {REQUEST_URI}! ^ / Blog ($ | /) $
Вы должны удалить $
(привязку конца строки) в конце этих двух CondPatterns . В противном случае запросы для / blog /
будут перенаправлены на / wp-main / ...
, поскольку вышеуказанное условие выполняется (поскольку не соответствует шаблону ^ / blog ($ | /) $
).
Попробуйте изменить логику и перепишите / blog
(более конкретный URL ) первый. (И используйте флаги L
, чтобы предотвратить дополнительную обработку.)
ОБНОВЛЕНИЕ: Вместо этого попробуйте следующее ...
Я изменил логику, так что / blog
обрабатывается первым (более конкретный URL ). Это избавляет вас от необходимости явно избегать / blog
при переписывании основного сайта. Я также предполагал, что у вас есть только один домен (о котором я спрашивал в своем предыдущем комментарии) - это позволяет избежать необходимости проверять заголовок Host
(т.е. переменная сервера HTTP_HOST
) . Если у вас есть более одного домена в вашей учетной записи, ваши текущие директивы все равно были неполными.
Вам не нужна оболочка
, если только ваш сайт не предназначен для работы без mod_rewrite (это не так).
Потенциально все, что вам нужно, это:
RewriteEngine on
# Rewrite blog site
RewriteRule ^blog/?(.*)$ /wp-blog/$1 [L]
# Rewrite everything else to the main site
RewriteRule (.*) /wp-main/$1 [L]
Несколько предположений:
Каждый подкаталог ( / wp-blog
и / wp-main
) имеет собственный файл .htaccess
(с директивами mod_rewrite) - это предотвращает цикл перезаписи.
Нет статических ресурсов вне этих установок WordPress. Также переписываются все статические ресурсы. например. /images/foo.jpg
внутренне переписан на /wp-main/images/foo.jpg
и /blog/images/foo.jpg
переписан на /wp-blog/images/foo.jpg
и т. Д. Вы никогда не ссылаетесь на / wp-main
или / wp-blog
непосредственно в клиентском HTML. Если есть общие статические ресурсы в других местах (например, подкаталог / scripts
вне реального корня документа), вам потребуется либо дополнительная проверка файловой системы (если есть слишком много мест для перечисления), либо включить исключение для этого местоположения перед существующими директивами. Например:
RewriteRule ^ scripts / - [L]
Оба / blog
и / blog /
(с косой чертой) обращаются к домашней странице вашего блога (это позволяет избежать перезаписи / blog
на ваш основной сайт). В идеале только / blog /
должен иметь доступ к вашему блогу, и / blog
будет перенаправлять на него. Этого можно добиться с помощью дополнительного перенаправления перед перезаписью блога:
# Перезапись блога на сайте
RewriteRule ^ (блог) $ / $ 1 / [R = 302, L]
RewriteRule ^ blog /?(.*)$ / wp-blog / $ 1 [L]
Измените 302
(временный) на 301
(постоянный), только если вы уверены, что это именно то, что вам нужно, и подтвердили, что он работает нормально. 301 постоянно кэшируются браузером.
Затем каждый файл .htaccess
в соответствующем подкаталоге должен иметь форму:
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
Нет необходимости указывать RewriteBase
или включать подкаталог в подстановке RewriteRule
.