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) с этими последними правилами.

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

1
задан 11 May 2020 в 19:18
2 ответа

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

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

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

0
ответ дан 4 January 2021 в 08:45

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 .

]
1
ответ дан 4 January 2021 в 08:45

Теги

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