Как изменить адресную строку в PHP: редирект, красивые адрес и History API

Короткий ответ: 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. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x