Przetestowałem to, prosząc moją stronę internetową (apache) o wszystkie dostępne znaki na mojej niemieckiej klawiaturze jako parametr adresu URL:
http://example.com/?^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=? `QWERTZUIOPÜ*ASDFGHJKLÖÄ\'>YXCVBNM;:_²³{[]}\|µ@€~
Nie zostały one zakodowane:
^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-!/()=?`*;:_{}[]\|~
Nie zakodowany po urlencode()
:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_
Nie zakodowany po rawurlencode()
:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~
Uwaga: przed PHP 5.3.0 rawurlencode()
zakodowany z ~
powodu RFC 1738 . Ale został zastąpiony przez RFC 3986, więc teraz jest bezpieczny w użyciu. Ale nie rozumiem, dlaczego na przykład {}
są kodowane, rawurlencode()
ponieważ nie są wymienione w RFC 3986.
Dodatkowy test, który przeprowadziłem, dotyczył automatycznego linkowania w wiadomościach e-mail. Przetestowałem Mozilla Thunderbird, aol.com, outlook.com, gmail.com, gmx.de i yahoo.de i w pełni powiązane adresy URL zawierające te znaki:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~+#,%&=*;:@
Oczywiście również ?
był powiązany, ale tylko jeśli był użyty raz.
Niektórzy sugerują teraz używanie tylko rawurlencode()
znaków, ale czy słyszałeś kiedyś, że ktoś miał problemy z otwarciem tych stron?
Gwiazdka
http://wayback.archive.org/web/*/http://google.com
Dwukropek
https://en.wikipedia.org/wiki/Wikipedia:About
Plus
https://plus.google.com/+google
Na znak, dwukropek, przecinek i wykrzyknik
https: //www.google.com/maps/place/USA/@36.2218457, ...
Z tego powodu te znaki powinny być użyteczne bez zakodowania. Oczywiście nie powinieneś używać&;
powodu takich sekwencji kodujących &
. Ten sam powód obowiązuje, %
ponieważ był używany do kodowania znaków w ogóle. I =
ponieważ przypisuje wartość do nazwy parametru.
Na koniec powiedziałbym, że można używać tych niezakodowanych:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~!+,*:@
Ale jeśli oczekujesz losowo generowanych adresów URL, nie powinieneś ich używać .!
, ponieważ oznaczają one koniec zdania, a niektóre aplikacje pocztowe nie łączą automatycznie ostatniego znaku adresu URL. Przykład:
Visit http://example.com/foo=bar! !
!*'();:@&=+$,/?#[]
lub niezarezerwowaneA-Za-z0-9_.~-
(lub znak procentowy%
jako część kodowania procentowego)