Назад | Перейти на главную страницу

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>
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 замена.