Bir url sorgu parametresi değeri yoksa geçerli mi?


138

Bir URL http://example.com/foo?bargeçerli mi?

Ben şu ya da bu şekilde söyleyen resmi bir şey için bir bağlantı arıyorum. Basit bir evet / hayır cevabı veya anekdot kanıtları onu kesmez.


3
URI RFC'ye ek olarak bunun gerçek bir dünya örneğine dikkat çekmek istiyorum. Drupal bu değersiz sorgu parametrelerini bazı bağlantılarda önbellek bozma biçimi olarak kullanır. www.google-analytics.com/analytics.js?o490ub veya /themes/seven/ie.css?o4eppb. Muhtemelen bunu zaten biliyorsunuzdur, ancak bazıları bunun üzerine tökezleyebilir.
Elijah Lynn

Yanıtlar:


103
  • URI RFC için geçerlidir
  • Sunucu tarafı çerçeveniz / kodunuz tarafından kabul edilebilir

URI RFC sorgu dizesi için bir format zorunlu kılmamaktadır. Sorgu dizesinin genellikle ad-değer çiftleri taşıyacağı kabul edilse de, (örneğin genellikle başka bir URI içerecektir) gerekli değildir.

3.4. Sorgu

Sorgu bileşeni, yol bileşenindeki (Bölüm 3.3) verilerle birlikte, URI'nin düzeni ve adlandırma yetkisi (varsa) kapsamındaki bir kaynağı tanımlamaya yarayan hiyerarşik olmayan veriler içerir. ...

... Ancak, sorgu bileşenleri genellikle "anahtar = değer" çiftleri şeklinde tanımlayıcı bilgileri taşımak için kullanıldığından ve sık kullanılan bir değer başka bir URI'ye referanstır, ...

HTML , HTTP GET aracılığıyla gönderilen bir formun, form değerlerini "? Key1 = value1 & key2 = value2 ..." (düzgün şekilde kodlanmış) biçiminde ad-değer çiftleri olarak kodlaması gerektiğini belirler. Sorgu dizesinin ayrıştırılması sunucu tarafı koda bağlıdır (örn. Java sunucu uygulaması motoru).

Varsa, hangi sunucu tarafı çerçevesini kullandığınızı belirlemezsiniz, ancak sunucu tarafı çerçevenizin sorgu dizesinin her zaman ad-değer çiftlerinde olacağını varsayabilir ve olmayan bir sorgu dizesini boğabilir bu biçimde (ör. ?bar). Sorgu dizesini ayrıştıran kendi özel kodunuz varsa, yalnızca bu sorgu dizesi biçimini işlediğinizden emin olmanız gerekir. Bir çerçeve ise, belgelerinize bakmanız veya nasıl işlendiğini görmek için test etmeniz gerekir.


7
ASP.NET MVC (4 ve 5 sürümler benim bilgim) kesinlikle sağlanan hiçbir değer olmadığında boğuldu :(
AR

2
isindexSihirli nameHTML5 anahtar-değer biçimi olmadan bir sorgu dizesi göndermeyi sağlar stackoverflow.com/a/37579004/895245
Ciro Santilli郝海东冠状病六四事件法轮功

@CiroSantilli 烏坎 事件 2016 六四 事件 法轮功 HTML3'ün eski desteği için kullanımdan kaldırılmış bir özellik
Evan Carroll

80

Tamamen geçerli. Onları mafya habercisinin arkasında sessizce duran büyük kaslı adamın eşdeğeri olarak düşünebilirsiniz. Adamın bir adı yok ve konuşmuyor, ama sadece varlığı bilgi taşıyor.


19
Gangster kaslı adamın bir adı var, sadece bilmiyorsun. Bunu param üzerinde biliyorsunuz ve temel olarak bir boole değeri taşıyor (mevcut, yok).
Vlasec

2
Onu tanımlamanın en iyi yolu :)
Mohammad Kermani

1
Büyük adamın adı Cheich , Star Trek: Deep Space 9'daki casino soygun bölümünden
Anthony Rutledge

8

"" Http "şeması, HTTP protokolü aracılığıyla ağ kaynaklarını bulmak için kullanılır. Bu bölüm, http URL'lerinin şemaya özel sözdizimini ve semantiği tanımlar." http://www.w3.org/Protocols/rfc2616/rfc2616.html

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

Evet, soru işaretinden sonra her şey geçerli. Sunucunuz farklı şekilde yorumlayabilir, ancak anekdot olarak , bazı dillerin listelenmişse doğru olan bir boolean değeri olarak kabul edildiğini görebilirsiniz.


6
Biçimsel tanım için, yasal karakter kümesini ve özel anlamı olanlar dışında, sorgu dizesinin içeriğinde sessiz olan RFC 2396'ya ( ietf.org/rfc/rfc2396.txt ) bakın . Özellikle, "sorgu bileşeninin kaynak tarafından yorumlanacak bir bilgi dizisi" olduğunu, tanımının protokole bağlı olduğunu ve dolayısıyla key = değerinin büyük ölçüde kural gereği olduğunu belirtir .
RobertB

6

Evet, geçerli.

Birisi parametrenin var olup olmadığını kontrol etmek istiyorsa, bunu yapmanın bir yolu budur.


4

URI Özelliği

URI spesifikasyonunun tek ilgili kısmı , ilk ve birincisi arasındaki her şeyin spesifikasyonun bir sorgu tanımına uymasını bilmektir . Gibi herhangi bir karakter içerebilir . Bu , veya gibi bir sorgu dizesinin geçerli olduğu anlamına gelir .?#[:/.?]?bar?ten+green+apples

RFC 3986'yı burada bulun

HTML Spesifikasyonu

isindex anlamlı bir şekilde HTML5 değildir.

Yalnızca formdaki ilk öğe olarak kullanımdan kaldırılmıştır ve adsız olarak gönderilir.

Girdinin adı "isindex" ise, türü "metin" dir ve bu form veri kümesindeki ilk girdidir, ardından sonuca değeri ekleyin ve bu girdinin diğer alt adımlarını atlayarak bir sonrakine geçin. varsa giriş veya aksi takdirde genel algoritmanın bir sonraki adımı.

İsindex bayrağı yalnızca eski kullanım içindir. HTML belgelerine uyma biçimindeki formlar, bu işaret kümesiyle kodu çözülmesi gereken yükler oluşturmaz.

İsindex en son desteklendiğinde HTML3 oldu . HTML5'te kullanımı geriye dönük uyumluluğu kolaylaştırmaktır.

Kütüphanelerde destek

Bu URI biçimi için kütüphanelerde verilen destek değişiklik gösterir, ancak bazı kütüphaneler kullanımı kolaylaştırmak için eski destek sağlar isindex.

Perl URI.pm (özel destek)

Perl URI'si gibi bazı kütüphaneler bu tür yapıları ayrıştırma yöntemleri sunar

$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(özel destek yok)

Çok daha sık bir başka örnek olarak, node.jsnormal rotayı alır ve

  • Dizi
  • veya bir anahtar ve değer nesnesi (kullanarak parseQueryString)

Buna benzer bir şey izleyen diğer URI ayrıştırma API'lerinin çoğu.



3

isindexnameHTML5'ten kullanımdan kaldırılmış sihir

Kullanımdan kaldırılan bu özellik, form gönderiminin böyle bir URL oluşturmasına izin vererek HTML için geçerli olduğuna dair daha fazla kanıt sunar. Örneğin:

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

türünde bir URL oluşturur:

?bar

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

isindexancak şu adreste belirtildiği gibi kullanımdan kaldırılmıştır: https://stackoverflow.com/a/41689431/895245


1

Diğer tüm cevapların açıkladığı gibi, özellikle boole tür şeyler için kontrol için mükemmel bir şekilde geçerlidir

Sorgu dizesini ada göre almak için basit bir işlev:

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

ve şimdi aradığınız sorgu dizesinin mevcut olup olmadığını kontrol etmek istiyorsanız, aşağıdaki gibi basit bir şey yapabilirsiniz:

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

exampleQueryStringolacak falseişlev sorgu dizesi bulamazsa başka türlü olacak true.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.