(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 любого существующего ресурса.