Bir URL'nin boşluk içermesine izin verilir mi?


132

Bir URI'nin (özellikle bir HTTP URL'sinin) bir veya daha fazla boşluk karakteri içermesine izin verilir mi? Bir URL'nin kodlanması gerekiyorsa , +yalnızca yaygın olarak izlenen bir kural mı yoksa meşru bir alternatif mi?

Özellikle, birisi boşluk içeren bir URL'nin kodlanması gerektiğini belirten bir RFC'ye işaret edebilir mi?

Soru motivasyonu: Bir web sitesinin beta testini yaparken, bazı URL'lerin içlerinde boşluklarla oluşturulmuş olduğunu fark ettim. Firefox beni şaşırtan doğru şeyi yapıyor gibiydi! Ancak geliştiricileri bir RFC'ye yönlendirebilmek istedim, böylece bu URL'leri düzeltme ihtiyacı hissedeceklerdi.


daha sonra gelen üst set: tüm geçersiz karakterler nelerdir: stackoverflow.com/questions/1547899/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Yanıtlar:


101

Gereğince RFC 1738'de :

güvensiz:

Karakterler çeşitli nedenlerden dolayı güvensiz olabilir. Boşluk karakteri güvensizdir, çünkü URL'ler yazıya döküldüğünde veya dizildiğinde veya kelime işleme programlarına tabi tutulduğunda önemli boşluklar kaybolabilir ve önemsiz boşluklar eklenebilir. Karakterleri "<"ve ">"serbest metinde URL'lerin etrafında sınırlayıcı olarak kullanıldığından, güvensiz; tırnak işareti ( """), bazı sistemlerde URL'leri sınırlandırmak için kullanılır. Karakter "#"güvensizdir ve her zaman kodlanmalıdır çünkü World Wide Web'de ve diğer sistemlerde bir URL'yi onu takip edebilecek bir parça / çapa tanımlayıcısından ayırmak için kullanılır. Karakter"%"diğer karakterlerin kodlanması için kullanıldığından güvensizdir. Diğer karakterler güvensizdir çünkü ağ geçitleri ve diğer taşıma aracılarının bazen bu tür karakterleri değiştirdiği bilinmektedir. Bu karakterler vardır "{", "}", "|", "\", "^", "~", "[", "]", ve "`".

Güvenli olmayan tüm karakterler her zaman bir URL içinde kodlanmalıdır . Örneğin, karakter "#", normalde parça veya bağlantı tanımlayıcılarla ilgilenmeyen sistemlerde bile URL'ler içinde kodlanmalıdır, böylece URL bunları kullanan başka bir sisteme kopyalanırsa, URL kodlamasını değiştirmek gerekli olmaz.


2
1738, 2396 tarafından aşılmıştır. İetf.org/ rfc/ rfc2396.txt Bu, mevcut Uri spesifikasyonudur. Yine de bu durumda önemli değil.
Steve Kıdem tazminatı

40
Ve 2396'nın yerini 3986 almıştır. RFC'ler değişmez olduğu için birçok insan bunu yanlış anlar ve bu nedenle okuyucuya kullanımdan kaldırıldıklarını söylemez. İpucu: Kullanım tools.ietf.org/html/rfcnnnn gibi tools.ietf.org/html/rfc2396 bunun yerine, üst üste eksik meta verileri görüntüler.
Julian Reschke

43

Neden kodlanması gerekiyor? Bir istek şuna benzer:

GET /url HTTP/1.1
(Ignoring headers)

Beyaz boşlukla ayrılmış 3 alan vardır. URL'nize boşluk koyarsanız:

GET /url end_url HTTP/1.1

4 alanınız olduğunu biliyorsunuz, HTTP sunucusu size bunun geçersiz bir istek olduğunu söyleyecektir.

GET /url%20end_url HTTP/1.1

3 alan => geçerli

Not: sorgu dizesinde (?), Boşluk genellikle + olarak kodlanır

GET /url?var=foo+bar HTTP/1.1 

ziyade

GET /url?var=foo%20bar HTTP/1.1 

Ya var gerçekten "foo + bar" ise "foo bar" değilse?
Ivo3185

2
Bunun URI spesifikasyonunun kendisinin değil, taşıma katmanının bir gereği olduğunu iddia ediyorum. GET, URL spesifikasyonunun değil, açıkça http: spesifikasyonunun bir özelliğidir. Benzer şekilde, url'lerdeki tırnakların "kodlanması gerektiğini" çünkü aksi takdirde web sayfalarının bozulacağını iddia edebilirsiniz. Ancak bu, URL spesifikasyonunun bir özelliği değil, HTML biçimlendirme sınırlamalarının bir özelliğidir (buna karşı başka stratejiler vardır).
Kent Fredric

ietf.org/rfc/rfc1738.txt - Boşluk dahil güvenli olmayan karakterler kodlanmalıdır
Julien

@KentFredric Bu daha çok taşıma katmanı değil sunum katmanıdır. As Julien (neredeyse) yazıyor, orijinal URI Spec ( 1630 RFC ne olursa olsun, kişisel duyguların URI şartname kendisinin bir parçası yani), bu kısıtlamayı içerir. URI spesifikasyonu HTTP taslaklarından sonra yazıldığı için, URI'lerin boşlukların kullanımına karşı yasak dahil olmak üzere akılda HTTP ile tasarlanmış olması çok mümkündür, ancak bu gerçekten önemli değil, değil mi? Gerçek şu ki, spesifikasyon, spesifikasyonun ne olduğu.
Christopher Schultz

38

Daha kısa cevap: hayır, bir boşluk kodlamalısınız; o olduğu gibi bir boşluk kodlamak için doğru +ama sadece sorgu dizesinde; kullanman gereken yolda %20.


1
Merhaba, ben de kafam karıştı, bazen kitabın "+" kullandığını gördüm ama bazen "% 20" bunun için bir örnek gösterebilir misin? Kullanıcı formu gönderdiğinde, form alanı nasıl kodluyor? hangi karakterle
GMsoF

1
Ek ayrıntı için bu yanıta bakın .
DavidRR

parça / karma kısım ne olacak? Orada boşluklar nasıl kodlanmalıdır?
gumkins

@gumkins: parça (# ve sonrası) sunucuya gönderilmez. Pratikte, bir boşluğu kodlamak için herhangi bir yerde% 20 veya + kullanabilirsiniz.
Julien

9

URL'ler RFC 3986'da tanımlanmıştır , ancak diğer RFC'ler de ilgilidir, ancak RFC 1738 artık kullanılmamaktadır.

Diğer birçok karakterle birlikte içlerinde boşluk olmayabilir. Bu yasaklanmış karakterlerin genellikle bir şekilde temsil edilmesi gerektiğinden, onları bir "%" ön eki ile ASCII onaltılık eşdeğerlerine çevirerek bir URL'ye kodlamak için bir şema vardır.

Çoğu programlama dili / platformu, RFC standartlarına tam olarak uymasalar da, URL'leri kodlamak ve çözmek için işlevler sağlar. Örneğin, PHP'nin olmadığını biliyorum.


7

Evet, boşluk genellikle "% 20" olarak kodlanmıştır. Bir URL'ye geçen tüm parametreler, yalnızca güvenlik nedenleriyle kodlanmalıdır.


6

URL'nin içinde bir Boşluk Karakteri olabilir ve çoğu tarayıcıda% 20 olarak görüntülenir, ancak tarayıcı kodlama kuralları çok sık değişir ve tarayıcının URL'yi nasıl görüntüleyeceğine bağlı olamayız.

Bunun yerine URL'deki Boşluk Karakterini, URL'yi Daha okunabilir ve 'Güzel' yapacağını düşündüğünüz herhangi bir karakterle değiştirebilirsiniz;) ..... O nedenle tercih edilen genel karakterler "-", "_", "+" .... ancak bunlar zorunlu değildir, bu nedenle URL’de olması gerekmeyen herhangi bir karakteri kullanabilirsiniz.

Lütfen URL Alanı Karakter Değişimi olarak%, &,}, {,], [, /,>, <kullanmaktan kaçının çünkü bunlar belirli tarayıcılarda ve Platformlarda bir hata ortaya çıkarabilir.

Gördüğünüz gibi Stak taşmasının kendisi Boşluk (% 20) yerine '-' karakterini kullanıyor.

Mutlu bir sorgulama dilerim.


5

Urls gerektiğini değil bunları boşluklar var. Bunu yapan birini ele almanız gerekiyorsa, kodlanmış değerini kullanın%20


5

Birisi, boşluk içeren bir URL'nin kodlanması gerektiğini belirten bir RFC'ye işaret edebilir mi?

URI'ler ve dolayısıyla URL'ler RFC 3986'da tanımlanmıştır.

Orada tanımlanan dilbilgisine bakarsanız, sonunda bir boşluk karakterinin asla sözdizimsel olarak yasal bir URL'nin parçası olamayacağını fark edeceksiniz, bu nedenle "boşluklu URL" terimi kendi içinde bir çelişkidir.


3

Soruna cevap vermek için. Uygulamaların URL'lerde kullanılacak değerlerdeki boşlukları değiştirmesinin oldukça yaygın olduğunu söyleyebilirim. Bunun nedeni, genellikle, okunması daha zor olan yüzde (URI) kodlamasından kaçınmaktır.

Yüzde kodlama hakkındaki bu Wikipedia makalesine göz atın .


2

Firefox 3, %20URL'lerde adres çubuğunda boşluklar olarak URL'leri görüntüler .


Bu oldukça basit soruya doğru cevap değildir: "Is a URL allowed to contain a space?". Daha ziyade bir yorum.
Roko C. Buljan
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.