Un parametro di query url è valido se non ha valore?


138

Un url è http://example.com/foo?barvalido?

Sto cercando un link a qualcosa di ufficiale che dice in un modo o nell'altro. Una semplice risposta sì / no o prove aneddotiche non la taglieranno.


3
Oltre all'URI RFC, voglio sottolineare un esempio reale di questo. Drupal utilizza questi parametri di query senza valore in alcuni collegamenti come forma di busting della cache. ad es. www.google-analytics.com/analytics.js?o490ub o /themes/seven/ie.css?o4eppb. Probabilmente lo sai già, ma alcuni inciampare su questo potrebbe non esserlo.
Elijah Lynn,

Risposte:


103
  • Valido per l'URI RFC
  • Probabilmente accettabile per il tuo framework / codice lato server

L' URI RFC non impone un formato per la stringa di query. Sebbene sia riconosciuto che la stringa di query spesso porterà coppie nome-valore, non è necessario (ad es. Conterrà spesso un altro URI).

3.4. domanda

Il componente di query contiene dati non gerarchici che, insieme ai dati nel componente percorso (Sezione 3.3), servono a identificare una risorsa nell'ambito dello schema dell'URI e dell'autorità di denominazione (se presente). ...

... Tuttavia, poiché i componenti di query vengono spesso utilizzati per trasportare informazioni di identificazione sotto forma di coppie "chiave = valore" e un valore utilizzato di frequente è un riferimento a un altro URI, ...

HTML stabilisce che un modulo inviato tramite HTTP GET dovrebbe codificare i valori del modulo come coppie nome-valore nel modulo "? Key1 = value1 & key2 = value2 ..." (codificato correttamente). L'analisi della stringa di query dipende dal codice lato server (ad es. Motore servlet Java).

Non si identifica il framework lato server che si utilizza, se presente, ma è possibile che il framework lato server possa supporre che la stringa di query sia sempre in coppie nome-valore e potrebbe soffocare su una stringa di query che non è in quel formato (ad es ?bar.). Se è il tuo codice personalizzato che analizza la stringa di query, devi semplicemente assicurarti di gestire quel formato di stringa di query. Se si tratta di un framework, dovrai consultare la tua documentazione o semplicemente testarla per vedere come viene gestita.


7
ASP.NET MVC (versioni 4 e 5 per quanto ne so) sicuramente soffocano quando non viene fornito alcun valore :(
AR

2
La isindexmagia namedi HTML5 permette l'invio di una stringa di query senza formato chiave-valore stackoverflow.com/a/37579004/895245
Ciro Santilli郝海东冠状病六四事件法轮功

@CiroSantilli 事件 事件 2016 六四 事件 法轮功 come funzionalità obsoleta per il supporto legacy di HTML3
Evan Carroll

80

Sono perfettamente validi. Potresti considerarli come l'equivalente del grosso muscoloso in piedi dietro il messaggero della folla. Il ragazzo non ha un nome e non parla, ma la sua semplice presenza trasmette informazioni.


19
Il ragazzo muscoloso del mafioso ha un nome, semplicemente non lo sai. Lo sai sul parametro però e sostanzialmente ha un valore booleano (presente, assente).
Vlasec,

2
Il modo migliore per descriverlo :)
Mohammad Kermani,

1
Il grande ragazzo si chiama Cheich , da quell'episodio di rapina nei casinò di Star Trek: Deep Space 9.
Anthony Rutledge,

8

"Lo schema" http "viene utilizzato per individuare le risorse di rete tramite il protocollo HTTP. Questa sezione definisce la sintassi e la semantica specifiche dello schema per gli URL http." http://www.w3.org/Protocols/rfc2616/rfc2616.html

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

Quindi sì, tutto è valido dopo un punto interrogativo. Il tuo server potrebbe interpretare diversamente, ma aneddoticamente , puoi vedere alcune lingue che lo considerano come un valore booleano che è vero se elencato.


6
Per la definizione formale, vedere RFC 2396 ( ietf.org/rfc/rfc2396.txt ), che è silenzioso sul contenuto della stringa di query, oltre a specificare l'insieme legale di caratteri e quelli che hanno un significato speciale. In particolare, afferma che il "componente di query è una stringa di informazioni che deve essere interpretata dalla risorsa", il che implica che la sua definizione dipende dal protocollo, e quindi il valore chiave = è in gran parte per convenzione.
Robert B,

6

Sì, è valido

Se si desidera semplicemente verificare se il parametro esiste o meno, questo è un modo per farlo.


4

URI Spec

L'unica parte rilevante delle specifiche URI è sapere tutto tra il primo ?e il primo che si #adatta alla definizione della specifica di una query. Può includere caratteri come [:/.?]. Ciò significa che una stringa di query come ?bar, o ?ten+green+applesè valida.

Trova RFC 3986 qui

Spec. HTML

isindex non è significativamente HTML5.

Viene fornito obsoleto per essere utilizzato come primo elemento solo in un modulo e viene inviato senza un nome.

Se il nome della voce è "isindex", il suo tipo è "testo" e questa è la prima voce nel set di dati del modulo, quindi aggiungere il valore da ottenere e saltare il resto dei passi secondari per questa voce, passando al successivo voce, se presente, o il passaggio successivo dell'algoritmo generale altrimenti.

Il flag isindex è solo per uso legacy. I moduli in documenti HTML conformi non genereranno payload che devono essere decodificati con questo set di flag.

L'ultima volta che isindex è stato supportato è stato HTML3 . È usato in HTML5 per fornire una più semplice compatibilità con le versioni precedenti.

Supporto nelle biblioteche

Il supporto nelle librerie per questo formato di URI varia tuttavia alcune librerie forniscono supporto legacy per facilitarne l'uso isindex.

Perl URI.pm (supporto speciale)

Alcune librerie come l'URI di Perl forniscono metodi per analizzare questo tipo di strutture

$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(nessun supporto speciale)

Come altro esempio molto più frequente, node.jsprende la via normale e facilita l'analisi come uno dei due

  • Una stringa
  • oppure, un oggetto di chiavi e valori (usando parseQueryString)

La maggior parte delle altre API per l'analisi degli URI seguono qualcosa di simile a questo.



3

isindexmagia deprecata nameda HTML5

Questa funzione obsoleta consente all'invio di un modulo di generare tale URL, fornendo ulteriori prove della sua validità per HTML. Per esempio:

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

genera un URL di tipo:

?bar

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

isindexè tuttavia obsoleto come indicato in: https://stackoverflow.com/a/41689431/895245


1

Come tutte le altre risposte descritte, è perfettamente valido per il controllo, specialmente per cose tipo booleane

Ecco una semplice funzione per ottenere la stringa di query per nome:

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, " "));
}

e ora vuoi verificare se la stringa di query che stai cercando esiste o no, puoi fare una cosa semplice come:

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

lo exampleQueryStringsarà falsese la funzione non riesce a trovare la stringa della query, altrimenti lo sarà true.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.