¿Es válido un parámetro de consulta de URL si no tiene valor?

138

¿Es http://example.com/foo?barválida una url ?

Estoy buscando un enlace a algo oficial que dice de una manera u otra. Una respuesta simple de sí / no o evidencia anecdótica no será suficiente.

Conley Owens
fuente
3
Además del URI RFC, quiero señalar un ejemplo real de esto. Drupal utiliza estos parámetros de consulta sin valor en algunos enlaces como una forma de captura de caché. por ejemplo, www.google-analytics.com/analytics.js?o490ub o /themes/seven/ie.css?o4eppb. Probablemente ya lo sepas, pero es posible que algunos tropiecen con esto.
Elijah Lynn

Respuestas:

103
  • Válido para el URI RFC
  • Probablemente aceptable para su marco / código del lado del servidor

El URI RFC no exige un formato para la cadena de consulta. Aunque se reconoce que la cadena de consulta a menudo llevará pares de nombre-valor, no es necesario (por ejemplo, a menudo contendrá otro URI).

3.4. Consulta

El componente de consulta contiene datos no jerárquicos que, junto con los datos en el componente de ruta (Sección 3.3), sirven para identificar un recurso dentro del alcance del esquema y la autoridad de denominación del URI (si corresponde). ...

... Sin embargo, como los componentes de consulta a menudo se usan para llevar información de identificación en forma de pares "clave = valor" y un valor usado frecuentemente es una referencia a otro URI, ...

HTML establece que un formulario enviado a través de HTTP GET debe codificar los valores del formulario como pares de nombre-valor en el formulario "? Key1 = value1 & key2 = value2 ..." (codificado correctamente). El análisis de la cadena de consulta depende del código del lado del servidor (por ejemplo, el motor de servlet de Java).

No identifica qué marco del lado del servidor usa, si lo hay, pero es posible que su marco del lado del servidor pueda asumir que la cadena de consulta siempre estará en pares de nombre-valor y puede ahogarse en una cadena de consulta que no sea en ese formato (por ejemplo ?bar). Si es su propio código personalizado que analiza la cadena de consulta, simplemente debe asegurarse de manejar ese formato de cadena de consulta. Si es un marco, deberá consultar su documentación o simplemente probarla para ver cómo se maneja.

Bert F
fuente
77
ASP.NET MVC (versiones 4 y 5, que yo sepa) definitivamente se ahoga cuando no se proporciona ningún valor :(
AR
2
La isindexmagia namede HTML5 permite enviar una cadena de consulta sin formato de clave-valor stackoverflow.com/a/37579004/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@CiroSantilli 烏坎 事件 2016 六四 事件 法轮功 como una característica obsoleta para el soporte heredado de HTML3
Evan Carroll
80

Son perfectamente válidos. Podrías considerarlos como el equivalente del gran hombre musculoso parado en silencio detrás del mensajero de la mafia. El tipo no tiene nombre y no habla, pero su mera presencia transmite información.

Marc B
fuente
19
El tipo musculoso del mafioso tiene un nombre, simplemente no lo sabes. Sin embargo, lo sabes en el parámetro y básicamente tiene un valor booleano (presente, ausente).
Vlasec
2
La mejor manera de describirlo :)
Mohammad Kermani
1
El nombre del tipo grande es Cheich , de ese episodio de atraco de casino en Star Trek: Deep Space 9.
Anthony Rutledge
8

"El esquema" http "se utiliza para localizar recursos de red a través del protocolo HTTP. Esta sección define la sintaxis y la semántica específicas del esquema para las URL http". http://www.w3.org/Protocols/rfc2616/rfc2616.html

http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] 

Entonces sí, cualquier cosa es válida después de un signo de interrogación. Su servidor puede interpretar de manera diferente, pero de manera anecdótica , puede ver que algunos idiomas lo tratan como un valor booleano que es verdadero si se enumera.

Jeff Ferland
fuente
66
Para la definición formal, vea RFC 2396 ( ietf.org/rfc/rfc2396.txt ), que no menciona los contenidos de la cadena de consulta, excepto para especificar el conjunto legal de caracteres y aquellos que tienen un significado especial. Específicamente, dice que el "componente de consulta es una cadena de información para ser interpretada por el recurso", lo que implica que su definición depende del protocolo y, por lo tanto, el valor clave = es en gran medida por convención.
RobertB
6

Si, es valido.

Si uno simplemente quiere verificar si el parámetro existe o no, esta es una forma de hacerlo.

Oded
fuente
4

Especificaciones de URI

La única parte relevante de la especificación de URI es saber todo entre el primero ?y el primero se #ajusta a la definición de especificación de una consulta. Puede incluir cualquier personaje como [:/.?]. Esto significa que una cadena de consulta como ?bar, o ?ten+green+appleses válida.

Encuentra el RFC 3986 aquí

Especificación HTML

isindex no es significativamente HTML5.

Se proporciona en desuso para su uso como primer elemento solo en un formulario y se envía sin nombre.

Si el nombre de la entrada es "isindex", su tipo es "text", y esta es la primera entrada en el conjunto de datos del formulario, luego agregue el valor resultante y omita el resto de los subpasos para esta entrada, pasando a la siguiente entrada, si existe, o el siguiente paso en el algoritmo general de lo contrario.

El indicador isindex es solo para uso heredado. Los formularios para conformar documentos HTML no generarán cargas útiles que deban decodificarse con este conjunto de indicadores.

La última vez que se admitió isindex fue HTML3 . Su uso en HTML5 es para proporcionar una compatibilidad con versiones anteriores más fácil.

Apoyo en bibliotecas

El soporte en las bibliotecas para este formato de URI varía, sin embargo, algunas bibliotecas proporcionan soporte heredado para facilitar su uso isindex.

Perl URI.pm (soporte especial)

Algunas bibliotecas como el URI de Perl proporcionan métodos para analizar este tipo de estructuras.

$uri->query_keywords
$uri->query_keywords( $keywords, ... )
$uri->query_keywords( \@keywords )
Sets and returns query components that use the keywords separated by "+" format.

Node.js url(sin soporte especial)

Como otro ejemplo mucho más frecuente, node.jstoma la ruta normal y facilita el análisis como

  • Una cuerda
  • o, un objeto de claves y valores (usando parseQueryString)

La mayoría de las otras API de análisis de URI siguen algo similar a esto.

Evan Carroll
fuente
3

isindexmagia obsoleta namede HTML5

Esta característica en desuso permite que el envío de un formulario genere dicha URL, lo que proporciona más evidencia de que es válido para HTML. P.ej:

<form action="#isindex" class="border" id="isindex" method="get">
  <input type="text" name="isindex" value="bar"/>
  <button type="submit">Submit</button>
</form>

genera una URL de tipo:

?bar

Estándar: https://www.w3.org/TR/html5/forms.html#naming-form-controls:-the-name-attribute

isindexSin embargo, está en desuso como se menciona en: https://stackoverflow.com/a/41689431/895245

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
1

Como se describe en todas las demás respuestas, es perfectamente válido para verificar, especialmente para cosas de tipo booleano

Aquí hay una función simple para obtener la cadena de consulta por nombre:

function getParameterByName(name, url) {
    if (!url) {
        url = window.location.href;
    }
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
}

y ahora desea verificar si la cadena de consulta que está buscando existe o no, puede hacer algo simple como:

var exampleQueryString = (getParameterByName('exampleQueryString') != null);

la exampleQueryStringhabrá falsesi la función no puede encontrar la cadena de consulta, de lo contrario será true.

Mohammad Kermani
fuente