Intereting Posts
отображение данных из sql при нажатии на svg map Создание вывода JSON из многомерного массива Как изменить временную метку по умолчанию, которую использует PHP для входа в файл? PHP: Как отправить «JSON» с помощью метода PUT? Вызовите еще один PHP-скрипт и верните элемент управления пользователю до завершения другого скрипта динамически рисовать полилинии на googlemaps с помощью php / mysql Определение наличия файла в Laravel 5 PHP round time () вверх (будущее) до следующего кратного 5 минут Symfony 3 – код контроллера аутсорсинга в сервисный уровень управление потоком в зависимости от значения элемента xml Данные PHP mySql в файл JSON Обрабатывать исключение Guzzle и получать HTTP-теги Наследование класса таблицы Doctrine, когда один подкласс не имеет дополнительных атрибутов htaccess запрос пересылки, если внутренний ip Как отправить электронную почту через cron job usng PHP mysql

Изменить URL-адрес ответа без перенаправления

Возможно ли изменить 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-адрес, который вам нравится, и динамически передавать нужные данные, даже изменяя значения полей формы, которые вы отправляете).