(modx/htaccess/RewriteRule) - простейший редирект: test.html => resource0.html => index.php?q=resource0.html

Nov 14, 2015

Вопрос непосредственно modx не касается, но, возможно, в описанном поведении виноват именно он, возможно, нет. В файле .htaccess у всех прописаны следующие директивы:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Что здесь происходит — всем понятно. Предположим, на уровне Apache необходимо выполнить внутренний редирект с URI test.html на resource0.html (пример сильно упрощён, чтобы можно было сосредоточиться на проблеме).

Решить задачу можно 2 способами: 1. Перед стандартным редиректом modx (index.php?q=$1) прописать директивы:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^test\.html$ resource0.html [QSA]

Здесь флаг [L] мы не ставим, чтобы после нашего редиректа сработал стандартный редирект modx (index.php?q=$1). Загружаем в браузере URL site.ru/test.html Получаем: внешний (301) редирект на URL site.ru/resource0.html

2. Перед стандартным редиректом modx (index.php?q=$1) прописываем общий редирект с test.html на index.php?q=resource0.html

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^test\.html$ index.php?q=resource0.html [L,QSA]

Здесь указываем флаг [L], хотя и не обязательно, т.к. стандартный редирект modx после этого редиректа так и так не сработает. Загружаем в браузере URL site.ru/test.html Получаем: внешний (301) редирект на URL site.ru/resource0.html

Итог: В обоих случаях получаем редирект на нужную нам страницу (resource0.html), но редирект выполняется внешний, а не внутренний. Почему ?

P.S. Для воспроизведения описанной ситуации достаточно изменить site.ru на имя своего сайта, resource0.html — на URI любого существующего ресурса.