htaccess: перенаправление вложенной папки wordpress

Я пытался несколько часов и уже немного нервничаю по этому поводу, поэтому я, вероятно, не вижу очевидное.

У меня два сайта 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>
2
задан 2 March 2019 в 01:10
1 ответ
 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 .

1
ответ дан 3 December 2019 в 12:30

Теги

Похожие вопросы