Как настроить редирект с /contacts.php на /contacts для одного файла

    Веб-разработчики часто сталкиваются с задачей скрыть расширение .php в URL. Это улучшает читаемость адресов и соответствует требованиям SEO. Однако при попытке настроить редирект для одного файла, например /contacts.php на /contacts, возникают проблемы - страница либо доступна по двум адресам, либо уходит в бесконечное перенаправление. В этой статье мы разберём рабочее решение на основе Apache .htaccess.

    Почему стандартные решения не подходят

    Первый найденный код (RewriteCond %{REQUEST_URI} ^/contacts$ и RewriteRule ^ contacts.php) не отключает доступ к исходному файлу. В результате /contacts.php остаётся рабочим, а запрос на /contacts просто подгружает PHP-скрипт. Это не решает задачу однозначного редиректа.

    Второй вариант с универсальным правилом для всех .php файлов работает корректно, но затрагивает каждый скрипт на сайте. Если нужно изменить поведение только для одной страницы, использовать глобальное правило избыточно и может сломать другие URL.

    Решение: редирект только для /contacts.php

    Чтобы настроить перенаправление исключительно для /contacts.php, используйте следующий код в файле .htaccess (разместите его в корневой директории сайта):

    RewriteEngine On
    RewriteCond %{THE_REQUEST} /contacts\.php[\s?] [NC]
    RewriteRule ^ /contacts [R=301,L]
    RewriteRule ^contacts$ contacts.php [L]

    Как это работает

    • Первая пара строк (условие и правило) перехватывают запрос, если в нём встречается /contacts.php. Они выдают HTTP-статус 301 (постоянный редирект) на адрес /contacts.
    • Вторая пара строк обрабатывает обратный случай: когда пользователь заходит на /contacts, сервер не ищет файл с таким именем, а внутренне перенаправляет запрос на contacts.php. Это скрытое преобразование не видно в браузере.

    Такой подход исключает циклические редиректы, так как условие %{THE_REQUEST} проверяет именно исходный запрос (а не переписанный URL).

    Дополнительные рекомендации

    Если на сайте уже есть другие правила RewriteRule, убедитесь, что новые строки размещены до глобальных обработчиков. Для проверки работы редиректа используйте инструменты вроде cURL или браузерные расширения для просмотра HTTP-заголовков. После настройки очистите кеш браузера, чтобы старые редиректы не мешали.

    Что делать, если сайт на Nginx

    Если ваш сервер работает под управлением Nginx, принцип аналогичен, но синтаксис отличается. В конфигурационном файле виртуального хоста пропишите:

    location = /contacts.php { return 301 /contacts; }
    location = /contacts { try_files $uri /contacts.php; }

    Это обеспечит такое же поведение - перенаправление с расширением и внутреннее переписывание без расширения.

    Часто задаваемые вопросы

    Почему нельзя просто использовать Redirect 301?

    Директива Redirect 301 проверяет только совпадение URL. Если прописать Redirect 301 /contacts.php /contacts, то при запросе /contacts сервер не найдёт файл и может повторно применить правило к новому адресу, создав бесконечный цикл.

    Как проверить, что редирект работает корректно?

    Откройте консоль разработчика в браузере (F12) и перейдите на вкладку Network. Загрузите /contacts.php - в ответ вы должны увидеть код статуса 301 и заголовок Location: /contacts. Затем зайдите на /contacts - код статуса должен быть 200, а содержимое страницы - совпадать с contacts.php.

    Можно ли применить этот код для других файлов, например /about.php?

    Да, замените contacts на нужное имя файла в обеих строках. Например, для /about.php используйте RewriteCond %{THE_REQUEST} /about\.php[\s?] [NC] и RewriteRule ^about$ about.php [L].

    Что делать, если на сайте используется WordPress?

    WordPress часто уже содержит правила перезаписи в .htaccess. Добавьте приведённый код перед строкой # BEGIN WordPress, чтобы избежать конфликтов с его собственными редиректами.

    Часто задаваемые вопросы