Considere este formulario:
<form action="http://www.blabla.com?a=1&b=2" method="GET">
<input type="hidden" name="c" value="3" />
</form>
Al enviar este formulario (un formulario GET), los parámetros ayb están desapareciendo. ¿Hay alguna razón para eso? ¿Hay alguna forma de evitar este comportamiento?
Respuestas:
¿No es para eso que los parámetros ocultos son para comenzar ...?
No contaría con ningún navegador que retenga cualquier cadena de consulta existente en la URL de acción.
Como las especificaciones ( RFC1866 , página 46; HTML 4.x sección 17.13.3) establecen:
Tal vez uno podría codificar en porcentaje la URL de acción para incrustar el signo de interrogación y los parámetros, y luego cruzar los dedos para esperar que todos los navegadores dejen esa URL como está (y validen que el servidor también la entienda). Pero nunca confiaría en eso.
Por cierto: no es diferente para los campos de formulario no ocultos. Para POST, la URL de acción podría contener una cadena de consulta.
fuente
En HTML5, este es el comportamiento por especificación.
Ver http://www.w3.org/TR/2011/WD-html5-20110525/association-of-controls-and-forms.html#form-submission-algorithm
Consulte "4.10.22.3 Algoritmo de envío de formularios", paso 17. En el caso de un formulario GET a un URI http / s con una cadena de consulta:
Por lo tanto, su navegador eliminará la parte "? ..." existente de su URI y la reemplazará por una nueva según su formulario.
En HTML 4.01, la especificación produce URI no válidos, aunque la mayoría de los navegadores en realidad no hicieron esto ...
Consulte http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3 , paso cuatro: ¿el URI tendrá un? agregado, incluso si ya contiene uno.
fuente
?
se elimina todo lo que hay detrás de la URL de acción? Entonces, ¿qué es, si el parámetro GET en la url de acción contiene el destino, donde se debe procesar el formulario? gustaría:action="index.php?site=search"
. No estoy seguro, si poner el parámetro GET en campos de entrada ocultos es una buena idea.Lo que puede hacer es usar un foreach simple en la tabla que contiene la información GET. Por ejemplo en php:
fuente
Debe incluir los dos elementos (a y b) como elementos de entrada ocultos, así como C.
fuente
Location:
redireccionamiento del servidor si no desea ninguna interacción con el usuario final .Tuve un problema muy similar en el que para la acción de formulario, tenía algo como:
El botón llevaría al usuario al sitio, pero la información de la consulta desapareció, por lo que el usuario aterrizó en la página de inicio en lugar de la página de contenido deseada. La solución en mi caso fue descubrir cómo codificar la URL sin la consulta que llevaría al usuario a la página deseada. En este caso, mi objetivo era un sitio de Drupal, por lo que resultó que
/content/something
también funcionó. También podría haber usado un número de nodo (es decir/node/123
).fuente
Si necesita una solución alternativa, ya que este formulario se puede colocar en sistemas de terceros, puede usar Apache mod_rewrite de esta manera:
entonces su nuevo formulario se verá así:
y Apache agregará el tercer parámetro a la consulta
fuente
Tu construcción es ilegal. No puede incluir parámetros en el valor de acción de un formulario. Lo que sucede si intentas esto dependerá de las peculiaridades del navegador. No me sorprendería si funcionara con un navegador y no con otro. Incluso si parecía funcionar, no confiaría en él, porque la próxima versión del navegador podría cambiar el comportamiento.
"Pero digamos que tengo parámetros en la cadena de consulta y en las entradas ocultas, ¿qué puedo hacer?" Lo que puedes hacer es corregir el error. No es para ser sarcástico, pero esto es un poco como preguntar: "Pero digamos que mi URL usa signos de porcentaje en lugar de barras, ¿qué puedo hacer?" La única respuesta posible es que puedes arreglar la URL.
fuente
Esto es en respuesta a la publicación anterior de Efx:
Si la URL ya contiene la var que desea cambiar, se agrega nuevamente como un campo oculto.
Aquí hay una modificación de ese código para evitar duplicar vars en la URL:
fuente
cambie el método de solicitud a 'POST' en lugar de 'GET'.
fuente
Normalmente escribo algo como esto:
¡Esto está funcionando, pero no olvides desinfectar tus entradas contra los ataques XSS!
fuente