Что такое реврайты и как они работают?
Что проверяют
Понимаете ли вы, как запрос доходит до приложения, и различаете ли переписывание пути и редирект. Для тестировщика это вопрос про то, куда смотреть, когда открывается не та страница, а адрес в строке браузера выглядит правильным.
Как отвечать
Реврайт (rewrite) это правило на веб-сервере, прокси или во фреймворке, которое подменяет путь запроса внутри инфраструктуры, ничего не сообщая клиенту. Браузер отправил один адрес, получил по нему ответ с кодом 200, а обслужил запрос другой обработчик или вообще другой бэкенд.
Отличие от редиректа принципиальное: редирект это ответ 301, 302 или 307 с заголовком Location, браузер делает второй запрос, адресная строка меняется, в панели сети видно два обращения. Реврайт это один запрос, адрес прежний, снаружи следов нет.
Где встречается: nginx (директива rewrite с флагами last и break, а также proxy_pass), Apache mod_rewrite, секция rewrites в конфигурации Next.js, правила ingress. Типовые сценарии: версионирование API, проксирование части путей на другой сервис, отдача index.html для клиентской маршрутизации, раскладка трафика на эксперимент.
Что проверяет тестировщик: итоговый код ответа и наличие Location (видно через curl), заголовки Host и X-Forwarded-For на стороне бэкенда, целостность относительных ссылок и пути cookie, поведение на завершающем слеше, на строке запроса и на кодированных символах.
Где спотыкаются
Путают реврайт с редиректом и заводят дефект «страница не переадресуется», хотя правило работает ровно как задумано. Обратная ошибка тоже частая: ждут прежний адрес, а получают редирект и сломанную аналитику переходов.
Проверяют только в браузере. Кэш и Service Worker маскируют правило, нужен повторный запрос с отключённым кэшем или запрос из консоли. Отдельно стоит проверить все окружения: правила часто живут в конфигурации инфраструктуры, а не в коде, и на прод едут своим путём.
Не трогают граничные случаи шаблона. Жадная регулярка ловит лишние пути, порядок правил меняет результат, а правило, переписывающее путь само в себя, даёт ошибку 500 по исчерпанию внутренних переходов.