Возможно ли изменить URL-адрес ответа без выполнения перенаправления?
Немного более длинная история …
Из-за ограничений с формами HTML следующее не работает, потому что строка запроса из URL-адреса действия не отправляется на сервер:
<?php // handler.php ?> ... <form action="handler.php?lost=value" method="get"> <input type="text" name="filter-keyword" value="" /> <input type="submit" name="do-submit" value="Submit" /> </form> ...
Поэтому я решил переключиться на использование метода post и создать отдельный скрипт обработчика фильтра, который просто строит правильную строку запроса для файла «handler.php».
<?php // handler.php ?> ... <form action="filter-handler.php" method="post"> <input type="hidden" name="preserve-qs" value="lost=value" /> <input type="text" name="filter-keyword" value="" /> <input type="submit" name="do-submit" value="Submit" /> </form> ... // filter-handler.php <?php $new_url = 'handler.php?filter-keyword=' . $_POST['filter-keyword']; if (isset($_POST['preserve-qs']) && $_POST['preserve-qs'] != '') $new_url .= '&' . $_POST['preserve-qs']; header("Location: $new_url"); ?>
Возможно ли достичь этого без выполнения перенаправления?
// filter-handler.php <?php $qs_args = array( 'filter-keyword' => $_POST['filter-keyword']; ); if (isset($_POST['preserve-qs']) && $_POST['preserve-qs'] != '') parse_str($_POST['preserve-qs'], $qs_args); // Fake query string. $_GET = $qs_args; // handler script is blissfully unaware of the above hack. include('handler.php'); // ???? HOW TO UPDATE QUERY STRING IN BROWSER ADDRESS BAR ???? // Following no good because it redirects... //header("Location: $new_url"); ?>
в// filter-handler.php <?php $qs_args = array( 'filter-keyword' => $_POST['filter-keyword']; ); if (isset($_POST['preserve-qs']) && $_POST['preserve-qs'] != '') parse_str($_POST['preserve-qs'], $qs_args); // Fake query string. $_GET = $qs_args; // handler script is blissfully unaware of the above hack. include('handler.php'); // ???? HOW TO UPDATE QUERY STRING IN BROWSER ADDRESS BAR ???? // Following no good because it redirects... //header("Location: $new_url"); ?>
Да и нет.
Нет, потому что для фактического изменения URL-адреса с серверной стороны вам необходимо сделать перенаправление.
Да, потому что есть другие решения вашей проблемы.
Решение №. 1:
Измените код из первого примера на:
<?php // handler.php ?> ... <form action="handler.php" method="get"> <input type="hidden" name="lost" value="value" /> <input type="text" name="filter-keyword" value="" /> <input type="submit" name="do-submit" value="Submit" /> </form> ...
и это должно привести к правильному URL (с lost=value
).
Решение №. 2 (уродливый):
Перезапишите массив $_GET
в начале скрипта, чтобы обмануть приложение, считая, что параметры GET были переданы.
Решение №. 3 (об изменении URL без перенаправления):
Это решение, вероятно, не для вас, но на самом деле имитирует изменение URL. Это не на стороне сервера, но оно фактически изменяет URL для пользователя. Это называется pushState
(демо здесь ), и это функция HTML5 / JavaScript.
Если вы можете использовать JavaScript и делать запросы AJAX, это решение может быть идеально для вас (вы можете, например, вызвать любой URL-адрес, который вам нравится, и динамически передавать нужные данные, даже изменяя значения полей формы, которые вы отправляете).