Подтвердить что ты не робот

Отправка формы GET с параметрами строки запроса и скрытыми параметрами исчезают

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

В 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 с строкой запроса:

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

Если вам нужно обходное решение, так как эту форму можно разместить в сторонних системах, вы можете использовать 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 добавит третий параметр для запроса

Ответ 8

Это в ответ на вышеприведенное сообщение Efx:

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

Вот модификация этого кода, чтобы предотвратить дублирование vars в URL:

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

Ответ 9

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

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

Ответ 10

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

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

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