Следующее правило должно нацеливаться на мою первую страницу (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.