Я пытался несколько часов и уже немного на грани этого, поэтому я, вероятно, не вижу очевидного.
У меня два сайта 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/<something>
будет направлен на /wp-main/...
, поскольку указанное выше условие выполняется (поскольку оно не соответствовать образцу ^/blog($|/)$
).
Подумайте о том, чтобы изменить свою логику и переписать /blog
(чем больше конкретный URL) первым. (И используйте L
флаги для предотвращения дополнительной обработки.)
ОБНОВИТЬ: Вместо этого попробуйте следующее ...
Я изменил логику, так что /blog
обрабатывается первым ( более конкретно URL). Это избавляет вас от необходимости явно избегать /blog
при переписывании основного сайта. Я также предположил, что у вас есть только один домен (о котором я спрашивал в своем предыдущем комментарии) - это позволяет избежать необходимости проверять Host
заголовок (т.е. HTTP_HOST
серверная переменная). Если у вас есть более одного домена в вашей учетной записи, ваши текущие директивы все равно были неполными.
Вам не нужен <IfModule mod_rewrite.c>
оболочка, если ваш сайт не предназначен для работы без 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
перенаправит на это. Этого можно достичь с помощью дополнительного перенаправления перед перезаписью блога:
# Rewrite blog site
RewriteRule ^(blog)$ /$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
замена.