Bir URL'de izin verilen karakterler


191

Herkes kodlanmadan bir GET içinde kullanılabilecek karakterlerin tam listesini biliyor mu? Şu anda AZ az ve 0-9 kullanıyorum ... ama tam listeyi bulmak istiyorum.

Ayrıca, Çin, Arap url'lerinin yakında ekleneceği için bir spesifikasyon olup olmadığı da ilgileniyorum (açıkçası bu benim sorum üzerinde büyük bir etkisi olacak)


5
Bir URI'de izin verilen karakterler ayrılmış !*'();:@&=+$,/?#[]veya korunmamış A-Za-z0-9_.~-(veya %yüzde kodlamasının bir parçası olarak yüzde karakteri )
Mikl

1
MySQL'de bunu REGEXP '[^]A-Za-z0-9_.~!*''();:@&=+$,/?#[%-]+'kötü karakterlere sahip URL dizesini bulmak için kullanıyorum . Belki başka biri için de faydalıdır.
Mikl

@Mikl: Bu şey normal bir ifadeye benzemiyor.
Jens Mander

Yanıtlar:


182

Gönderen RFC 1738 spesifikasyonu:

Bu nedenle, yalnızca alfasayısallar, " $-_.+!*'()," özel karakterleri ve ayrılmış amaçları için kullanılan ayrılmış karakterler bir URL içinde kodlanmamış olarak kullanılabilir.

EDIT: @Jukka K. Korpela doğru olarak işaret ettiği gibi, bu RFC RFC 3986 tarafından güncellendi . Bu, host için geçerli karakterleri genişletti ve açıklığa kavuşturdu, maalesef kolayca kopyalanıp yapıştırılmadı, ama elimden geleni yapacağım.

İlk eşleşen sırayla:

host        = IP-literal / IPv4address / reg-name

IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"

IPvFuture   = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )

IPv6address =         6( h16 ":" ) ls32
                  /                       "::" 5( h16 ":" ) ls32
                  / [               h16 ] "::" 4( h16 ":" ) ls32
                  / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
                  / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
                  / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
                  / [ *4( h16 ":" ) h16 ] "::"              ls32
                  / [ *5( h16 ":" ) h16 ] "::"              h16
                  / [ *6( h16 ":" ) h16 ] "::"

ls32        = ( h16 ":" h16 ) / IPv4address
                  ; least-significant 32 bits of address

h16         = 1*4HEXDIG 
               ; 16 bits of address represented in hexadecimal

IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet

dec-octet   = DIGIT                 ; 0-9
              / %x31-39 DIGIT         ; 10-99
              / "1" 2DIGIT            ; 100-199
              / "2" %x30-34 DIGIT     ; 200-249
              / "25" %x30-35          ; 250-255

reg-name    = *( unreserved / pct-encoded / sub-delims )

unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"     <---This seems like a practical shortcut, most closely resembling original answer

reserved    = gen-delims / sub-delims

gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

pct-encoded = "%" HEXDIG HEXDIG

5
@Zaman eğik çizgi ayrılmış bir karakterdir, bu nedenle, ayrılmış amacı için kullanılıyorsa (tanımlama yolları, protokol tanımlama ...), o zaman kaçmaya gerek yoktur. Aksi takdirde.
Myles

4
RFC
1738'in

3
@Myles, STD 66 (= RFC 3986) diğer cevaplarda belirtilmiştir. Yanıt içeriğinin doğru olup olmadığı farklı bir konudur; Cevapların hiçbirinin tam listeyi doğru bir şekilde tanımladığını düşünmüyorum.
Jukka K. Korpela

4
Ve A-Za-z0-9_.-~bu cevabın başına kaydedilmemiş ve ayrılmış karakterlerin listesini ekleyebilirsiniz . !*'();:@&=+$,/?#[]İnsanlar için zamandan tasarruf edebilir
Mikl

2
@basZero Kafa karıştırıcı bulduğunuz için üzgünüm, ancak yanıtın tamamı basit değil. Sorunuzun cevabı hayır, çünkü şu şekilde ayrılmış bir karakterdir:reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
Myles

42

Bir URI'de izin verilen karakterler ayrılmış veya kaydedilmemiş (veya yüzde kodlamasının bir parçası olarak yüzde karakteri)

http://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters

bunların RFC 3986 korunmayan karakterleri (sn. 2.3) ve özel anlamlarını korumaları gerekiyorsa ayrılmış karakterler (sn 2.2) olduğunu belirtir . Ve ayrıca yüzde kodlamanın bir parçası olarak yüzde karakteri.


7
Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve bağlantıyı referans olarak sağlamak daha iyidir. Bağlantı verilen sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir.
jaestevan

bağlantılı belgeden @jaestevan Citation:The characters allowed in a URI are either reserved or unreserved (or a percent character as part of a percent-encoding)
Mikl

26

Kaydedilmemiş 66 karakterin tam listesi RFC3986'dadır: http://tools.ietf.org/html/rfc3986#section-2.3

Bu, aşağıdaki normal ifade kümesindeki herhangi bir karakterdir:

[A-Za-z0-9_.\-~]

2
Ayrılmış olanları da kullanabilirsiniz.
Qwerty

Eski RFC1738 listelenmiş {}^\~ve backtickgüvenli değil. Ve RFC3986, dosya sistemi nedeniyle \ güvensiz olarak listeler. Bu {}^da kullanılabilir.
mgutt

Yani, diyelim ki, bir dizedeki bir URL'nin sonunu bulmaya çalışıyorsanız (ki ben), kabul edilen cevapta eski standartlara uymak en iyisidir ... URL'leri doğrularsanız , bu cevaptaki karakter kümesini kullanın .
ashleedawg

Dikkatli olun, bunu normal ifade karakter sınıfı olarak yazdınız. -Karakter sınıfının başına veya sonuna kaçtığınızdan veya koyduğunuzdan emin olun , çünkü [.-~]aslında 46 ila 126 arasındaki tüm ASCII karakterlerini içerir.
kwl

19

URL parametresi olarak Alman klavyemdeki mevcut tüm karakterlerle web sitemi (apache) isteyerek test ettim:

http://example.com/?^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=? `QWERTZUIOPÜ*ASDFGHJKLÖÄ\'>YXCVBNM;:_²³{[]}\|µ@€~

Bunlar kodlanmamıştır:

^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-!/()=?`*;:_{}[]\|~

Sonra kodlanmadı urlencode():

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_

Sonra kodlanmadı rawurlencode():

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~

Not: PHP 5.3.0'dan önce RFC 1738 nedeniyle rawurlencode()kodlanmıştır . Ancak bu RFC 3986 ile değiştirildi, bu yüzden şimdi kullanımı güvenlidir. Ancak, örneğin neden kodlandığını anlamıyorum çünkü RFC 3986'da belirtilmemişlerdir.~{}rawurlencode()

Yaptığım ek bir test, posta metinlerinde otomatik bağlantı ile ilgili idi. Mozilla Thunderbird, aol.com, outlook.com, gmail.com, gmx.de ve yahoo.de'yi test ettim ve bu karakterleri içeren URL'leri tamamen bağladılar:

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~+#,%&=*;:@

Tabii ki de ?bağlantılıydı, ancak sadece bir kez kullanıldıysa.

Bazı insanlar şimdi yalnızca rawurlencode()karakterleri kullanmanızı önerir , ancak birisinin bu web sitelerini açmakta sorun yaşadığını hiç duydunuz mu?

Yıldız işareti
http://wayback.archive.org/web/*/http://google.com

İki nokta üst üste
https://en.wikipedia.org/wiki/Wikipedia:Hakkında

Artı
https://plus.google.com/+google

İşarette, İki Nokta, Virgül ve Ünlem işareti
https: //www.google.com/maps/place/USA/@36.2218457, ...

Bu nedenle bu karakterlerin sorunsuz bir şekilde kodlanmamış kullanılabilmesi gerekir. Tabii ki &;kodlama dizileri nedeniyle kullanmamalısınız &amp;. Aynı neden, %genel olarak karakterleri kodlamak için kullanıldığı için de geçerlidir . Ve =parametre adına bir değer atar.

Sonunda bu kodlanmamış kullanmak için ok söyleyebilirim:

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~!+,*:@

Ancak rastgele oluşturulmuş URL'ler bekliyorsanız kullanmamalısınız .!, çünkü bunlar bir cümlenin sonunu işaretler ve bazı posta uygulamaları URL'nin son karakterini otomatik olarak bağlamaz. Misal:

Visit http://example.com/foo=bar! !

Pratik yaklaşım - iyi iş. Son listeni arıyordum - +özellikle işaret :-D
Oliver

12

Gönderen burada

Bu nedenle, yalnızca alfasayısallar, özel karakterler $-_.+!*'(), ve ayrılmış amaçları için kullanılan ayrılmış karakterler bir URL içinde kodlanmamış olarak kullanılabilir.



6

RFC3986 , bir URI'de kullanabileceğiniz iki karakter kümesi tanımlar:

  • Ayrılmış Karakterler ::/?#[]@!$&'()*+,;=

    saklıdır = gen-sınırlamaları / alt sınırlamaları

    gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"

    alt sınırlar = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

    Ayrılmış karakterlerin amacı, bir URI içindeki diğer verilerden ayırt edilebilen bir dizi sınırlayıcı karakter sağlamaktır. Ayrılmış bir karakterin karşılık gelen yüzde kodlu sekizli ile değiştirilmesinde farklılık gösteren URI'ler eşdeğer değildir.

  • Kaydedilmemiş Karakterler :A-Za-z0-9-_.~

    kaydedilmemiş = ALPHA / DIGIT / "-" / "." / "_" / "~"

    Bir URI'de izin verilen, ancak ayrılmış bir amacı olmayan karakterlere, rezerve edilmez denir.


3

Yaklaşan değişiklik, URI'lar için değil çince, arapça alan adları içindir. Uluslararasılaştırılmış URI'lere IRI denir ve RFC 3987'de tanımlanır . Bununla birlikte, bunu kendiniz yapmamanızı, ancak mevcut, test edilmiş bir kütüphaneye güvenmenizi tavsiye ettiğimi söyledikten sonra, URI kodlama / kod çözmenin birçok seçeneği olduğundan ve gerçek kullanımla neyin güvenli olduğu (tarayıcılar) ile spesifikasyon tarafından neyin güvenli olduğu kabul edilir .


0

Kullanıcılara özel bir deneyim sunmak istiyorsanız pushState, tarayıcının URL'sine çok çeşitli karakterler getirmek için kullanabilirsiniz :

resim açıklamasını buraya girin

var u="";var tt=168;
for(var i=0; i< 250;i++){
 var x = i+250*tt;
console.log(x);
 var c = String.fromCharCode(x);
 u+=c; 
}
history.pushState({},"",250*tt+u);
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.