Следующее правило должно нацеливаться на мою главную страницу (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) с этими последними правилами.
--- РЕШЕНО ---
Я тестировал это с моим .htaccess, содержащим только
RewriteRule ^ "/info.php?orig=%{REQUEST_URI}" [P]
. Когда я запросил http: // localhost / , REQUEST_URI содержал "/index.html", который конечно, не подходил для вашего второго RewriteCond.
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 ^ ($ | \ / $ | \? | \ / \?)
слишком сложен и слишком много совпадений. Он будет соответствовать только второму сегменту чередования (например, \ / $
) - если таковой имеется. Переменная REQUEST_URI
всегда начинается с косой черты и не содержит строки запроса. Также нет необходимости использовать обратную косую черту для экранирования косой черты (здесь нет разделителей регулярных выражений). Однако эта директива RewriteCond
не требуется - вы можете выполнить необходимую проверку в шаблоне RewriteRule
, который также будет более эффективным.
Попробуйте вместо этого следующее:
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(index\.php)?$ https://yy.example.com/ [P]
Шаблон RewriteRule
^ (index \ .php)? $
соответствует либо /
, либо /index.php
.