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

RewriteRule (обратный прокси) главной страницы в htaccess не работает

Следующее правило должно нацеливаться на мою первую страницу (WordPress), чтобы вместо этого обслуживать другую страницу.

RewriteCond %{HTTP_HOST} ^example.com$
RewriteCond %{REQUEST_URI}  ^($|\/$|\?|\/\?)
RewriteRule ^(.*) https://yy.example.com [P]

так https://example.com должен служить https://yy.example.com за кулисами.

Я также делаю это с несколькими другими подсайтами, например:

RewriteCond %{HTTP_HOST} ^example.com$
RewriteCond %{REQUEST_URI}  ^/zzz($|\/$|\?|\/\?)
RewriteRule ^(.*) https://yy.example.com/zzz [P]

который успешно служит https://yy.example.com/zzz для запроса на https://example.com/zzz. Это нужно делать только для определенных URL-адресов, а не для всего домена, кстати.

Однако первое правило для первой страницы не работает.

Если я использую [L,R=301] вместо этого он перенаправляет на https://yy.example.com так что RewriteCond работать правильно. Но почему-то только на первой странице RewriteRule не работает с [P] пока он работает с [L,R].

Что может быть причиной? Есть ли что-нибудь особенное, что нужно добавить для первой страницы? WordPress как-то возится с этим? Правила перезаписи находятся в самом верху .htaccess файл, так что никакие предыдущие правила с этим не связаны. Также обратите внимание, что [R] работает, что также указывает на то, что это правило действительно достигается, но не выполняется правильно при использовании [P] директива.

ОБНОВИТЬ: Следующее правило (от MrWhite) позволяет правильно перенаправить главную страницу:

RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^index\.php$ https://yy.example.com/ [P]

НО, поскольку Wordpress работает, он также перенаправляет любую другую страницу Wordpress, потому что из того, что я вижу, Wordpress перезаписывает любой "несуществующий" путь (из-за красивых ссылок, например https://example.com/zzz) в index.php, который затем определяет, какую страницу отображать, с помощью этих директив Wordpress по умолчанию.

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Итак, мы приближаемся, благодаря MrWhite, но мы еще не совсем там.

ЕЩЕ ОДИН ОБНОВЛЕНИЕ: Исправлены перенаправления Wordpress путем переименования индексного файла Wordpress в index-wp.php и адаптировать правило к:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index-wp.php [L]

Поэтому эффективно я использую обновленное правило MrWhite для перенаправления доступа на главную страницу (index.php), затем я фильтрую несколько подстраниц / zzz с помощью приведенных выше правил, а все остальное затем перенаправляется либо на фактические пути к серверу, либо в Wordpress. (index-wp.php) с этими последними правилами.

--- РЕШЕНО ---

Index.php Wordpress находится в корне.

mod_dir может выдавать внутренний подзапрос для индекса каталога (т.е. index.php) до того, как mod_rewrite / mod_proxy перехватит запрос, и в этом случае ваша директива не будет соответствовать. Однако с вашей директивой есть и другие проблемы ...

RewriteCond %{HTTP_HOST} ^example.com$
RewriteCond %{REQUEST_URI}  ^($|\/$|\?|\/\?)
RewriteRule ^(.*) https://yy.example.com [P]

В замена В строке после имени хоста отсутствует косая черта. Что-то необходимо добавить это, чтобы сделать действительный HTTP-запрос. В случае внешнего перенаправления браузер эффективно добавляет сюда завершающую косую черту.

В CondPattern ^($|\/$|\?|\/\?) слишком сложен и слишком много соответствует. Он будет соответствовать только 2-му сегменту чередования (т.е. \/$) - если есть. В REQUEST_URI переменная всегда начинается с косой черты и не содержит строки запроса. Также нет необходимости использовать обратную косую черту для экранирования косой черты (здесь нет разделителей регулярных выражений). Однако это RewriteCond директива не требуется - вы можете выполнить необходимую проверку в RewriteRule шаблон - что также будет более эффективным.

Вместо этого попробуйте следующее:

RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(index\.php)?$ https://yy.example.com/ [P]

В RewriteRule шаблон ^(index\.php)?$ соответствует либо / или /index.php.

Я тестировал это с моим .htaccess, содержащим только

RewriteRule ^ "/info.php?orig=%{REQUEST_URI}" [P]

Когда я просил http: // localhost /REQUEST_URI содержит "/index.html", что, конечно, не подходит для вашего второго RewriteCond.