отправка формы GET с параметрами строки запроса и скрытыми параметрами исчезает - PullRequest
206 голосов
/ 12 июля 2009

Рассмотрите эту форму:

<form action="http://www.blabla.com?a=1&b=2" method="GET">
    <input type="hidden" name="c" value="3" /> 
</form>

При отправке этой формы (формы GET) параметры a и b исчезают. Есть ли причина для этого? Есть ли способ избежать этого поведения?

Ответы [ 10 ]

237 голосов
/ 12 июля 2009

Разве не для этого нужны скрытые параметры ...?

<form action="http://www.example.com" method="GET">
  <input type="hidden" name="a" value="1" /> 
  <input type="hidden" name="b" value="2" /> 
  <input type="hidden" name="c" value="3" /> 
  <input type="submit" /> 
</form>

Я бы не рассчитывал, что браузер сохранит существующую строку запроса в URL-адресе действия.

Как указано в спецификациях ( RFC1866 , стр. 46; HTML 4.x , раздел 17.13.3):

Если метод "get" и действие представляет собой HTTP URI, пользовательский агент принимает значение action и добавляет `? ' к нему затем добавляется набор данных формы, закодированный с использованием типа контента application / x-www-form-urlencoded.

Может быть, кто-то может кодировать URL-адрес действия для встраивания знака вопроса и параметров, а затем скрестить пальцы, надеясь, что все браузеры оставят этот URL-адрес таким (и подтвердит, что сервер его тоже понимает). Но я бы никогда не положился на это.

Кстати: для не скрытых полей формы это не отличается. Для POST URL действия может содержать строку запроса.

66 голосов
/ 27 марта 2012

В HTML5 это поведение для каждой спецификации.

См. http://www.w3.org/TR/2011/WD-html5-20110525/association-of-controls-and-forms.html#form-submission-algorithm

Посмотрите на "4.10.22.3 Алгоритм отправки формы", шаг 17. В случае формы GET для URI http / s со строкой запроса:

Пусть destination будет новый URL, равный действию, за исключением того, что его <query> компонент заменен запросом (добавив U + 003F ВОПРОС Отметьте символ (?), Если необходимо).

Итак, ваш браузер уничтожит существующую часть?? ... вашего URI и заменит ее новой на основе вашей формы.

В HTML 4.01 спецификация создает недопустимые URI - хотя большинство браузеров этого не делают ..

См. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3, шаг четвертый - URI будет иметь? добавляется, даже если он уже есть.

16 голосов
/ 06 января 2012

То, что вы можете сделать, это использовать простой foreach для таблицы, содержащей информацию GET. Например в php:

foreach ($_GET as $key => $value) {
    echo("<input type='hidden' name='$key' value='$value'/>");
}
5 голосов
/ 12 июля 2009

Вы должны включить два элемента (a и b) в качестве скрытых элементов ввода, а также C.

1 голос
/ 07 сентября 2011

Ваше строительство незаконно. Вы не можете включить параметры в значение действия формы. Что произойдет, если вы попытаетесь это сделать, будет зависеть от особенностей браузера. Я не удивлюсь, если бы он работал с одним браузером, а не с другим. Даже если бы это работало, я бы не стал полагаться на это, потому что следующая версия браузера может изменить поведение.

"Но допустим, у меня есть параметры в строке запроса и в скрытых входах, что я могу сделать?" Что вы можете сделать, это исправить ошибку. Не быть глупым, но это немного похоже на вопрос: «Но допустим, что мой URL использует знаки процента вместо косой черты, что я могу сделать?» Единственный возможный ответ - вы можете исправить URL.

1 голос
/ 07 сентября 2011

У меня была очень похожая проблема, когда для действия формы у меня было что-то вроде:

<form action="http://www.example.com/?q=content/something" method="GET">
   <input type="submit" value="Go away..." />&nbsp;
</form>

Кнопка приведет пользователя на сайт, но информация о запросе исчезнет, ​​поэтому пользователь попадет на домашнюю страницу, а не на страницу с нужным содержимым. Решение в моем случае состояло в том, чтобы выяснить, как закодировать URL-адрес без запроса, который приведет пользователя к нужной странице. В этом случае моей целью был сайт Drupal, так что оказалось, что /content/something тоже работает. Я также мог бы использовать номер узла (т.е. /node/123).

0 голосов
/ 15 апреля 2015

Это ответ на вышеуказанный пост Efx:

Если URL-адрес уже содержит переменную, которую вы хотите изменить, он снова добавляется как скрытое поле.

Здесьявляется модификацией этого кода для предотвращения дублирования переменных в URL:

foreach ($_GET as $key => $value) {
    if ($key != "my_key") {
        echo("<input type='hidden' name='$key' value='$value'/>");
    }
}
0 голосов
/ 16 февраля 2014

Я обычно пишу что-то вроде этого:

foreach($_GET as $key=>$content){
        echo "<input type='hidden' name='$key' value='$content'/>";
}

Это работает, но не забывайте очищать свои входные данные от атак XSS!

0 голосов
/ 07 сентября 2013
<form ... action="http:/www.blabla.com?a=1&b=2" method ="POST">
<input type="hidden" name="c" value="3" /> 
</form>

изменить метод запроса на «POST» вместо «GET».

0 голосов
/ 07 мая 2013

Если вам нужен обходной путь, поскольку эту форму можно разместить в сторонних системах, вы можете использовать Apache mod_rewrite следующим образом:

RewriteRule ^dummy.link$ index.php?a=1&b=2 [QSA,L]

тогда ваша новая форма будет выглядеть так:

<form ... action="http:/www.blabla.com/dummy.link" method="GET">
<input type="hidden" name="c" value="3" /> 
</form>

и Apache добавит 3-й параметр к запросу

...