Короткий ответ: PHP не меняет адресную строку браузера напрямую после того, как страница уже загружена. PHP работает на сервере и может отправить редирект, сформировать ссылку, обработать красивый адрес или отдать страницу по другому маршруту. Если нужно поменять адрес без перезагрузки страницы, это уже задача JavaScript через History API
В этом запросе обычно смешаны три разных желания: перейти на другую страницу, сделать красивые адреса без index.php?id=5, или визуально поменять адрес в браузере без нового запроса. Для каждого случая решение разное
Случай 1: перейти на другой адрес
Для перехода используйте редирект
<?php
header('Location: /profile.php');
exit;
Важно вызвать header() до любого вывода HTML, пробелов или текста. Если до редиректа уже был вывод, PHP не сможет отправить заголовок
Редирект после формы
После обработки формы часто делают redirect, чтобы пользователь не отправил форму повторно при обновлении страницы
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// сохранить данные
header('Location: /thanks.php');
exit;
}
Это нормальный серверный способ изменить адресную строку через переход на другую страницу
Случай 2: красивые адрес
Если вы хотите адрес вида
/catalog/books
вместо
/catalog.php?category=books
нужна маршрутизация. PHP может разобрать путь, но веб-сервер должен отправлять такие запросы в ваш PHP-файл
Простой пример в PHP
<?php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($path === '/catalog/books') {
echo 'Каталог книг';
} elseif ($path === '/profile') {
echo 'Профиль';
} else {
http_response_code(404);
echo 'Страница не найдена';
}
На реальном сайте обычно используют настройки Nginx, Apache .htaccess или роутер фреймворка
Случай 3: убрать index.php из адреса
Если адрес выглядит так
/index.php/catalog/books
или
/index.php?page=about
нужно смотреть маршрутизацию сайта и настройки веб-сервера. В CMS это часто отдельная настройка “человекопонятные адрес”, “постоянные ссылки” или “SEF адрес”
PHP сам по себе не удалит index.php из адреса, если сервер не настроен отправлять запросы в нужный обработчик
Случай 4: изменить адрес без перезагрузки
Это уже JavaScript, а не PHP
history.pushState({}, '', '/new-address');
Так можно поменять адресную строку в браузере без запроса к серверу. Но если пользователь обновит страницу, сервер должен уметь обработать /new-address. Иначе будет 404
Как сформировать ссылку в PHP
Иногда пользователь говорит “изменить адресную строку”, хотя на самом деле хочет вывести правильную ссылку
<?php
$id = 15;
$url = '/product.php?id=' . urlencode((string) $id);
А выводить ссылку лучше с экранированием
<a href="<?= htmlspecialchars($url, ENT_QUOTES, 'UTF-8') ?>">Открыть товар</a>
Мини-практика
Сделайте файл login.php, который после отправки формы перенаправляет на profile.php. Затем сделайте простой роутер, который по адресу /about выводит текст “О сайте”
После этого попробуйте обновить страницу /about. Если сервер выдает 404, значит PHP-роутер есть, но веб-сервер не настроен на красивые адрес
Частые ошибки
Вызывают header('Location: ...') после вывода HTML. Редирект должен быть до вывода
Забывают exit после редиректа. Код ниже может продолжить выполняться
Путают редирект и красивый адрес. Редирект переносит пользователя, красивый адрес меняет схему маршрутов
Используют JavaScript pushState, но не настраивают сервер. После обновления страницы получается 404
Подставляют пользовательские данные в адрес без проверки и urlencode()
Думают, что PHP может поменять адрес уже загруженной страницы без участия браузера. Для этого нужен JavaScript
Что почитать дальше по PHP
Если нужен общий маршрут по теме, откройте рубрику PHP. Для соседних задач пригодятся эти разборы:
- Telegram-бот на PHP: простой бот через Bot API
- Timeweb: как изменить версию PHP на хостинге и проверить сайт
- substr в PHP: как обрезать строку по символам
- Как изменить PHP-файл на компьютере и проверить правку



