2012-12-13 15 views
7

Jeśli adres URL ma nietypowe znaki w części fragmentu (to znaczy po #) jak powinny być (procent) uciekł? Nie mogę znaleźć spójnej odpowiedzi na to, jak przeglądają ją przeglądarki, co jest prawdopodobnie dobrym powodem, aby ich nie mieć, ale chciałbym się dowiedzieć, jaka jest "właściwa" odpowiedź.Jak należy wyciszyć część fragmentu adresu URL?

Moje badania wydaje się sugerować, aby nie uciec w ogóle, ale że jest to tylko wiarygodne, gdy następujące linki, a nie podczas wklejania w pasku adresowym przeglądarki.

napisałem małą stronę internetową jako bieżącego. Następnie wkleiłem poniższy link do różnych przeglądarek. The „go” ogniwem strony jest tam, aby zobaczyć, co dzieje się po kliknięciu linku w przeciwieństwie do jej wklejenie (co wydaje się różnić w niektórych przeglądarkach)

http://www.frankieandshadow.com/test.html/?new=1# {# &}% 7B% 23% 20% 26 % 7D

(zauważam stackoverlow mecz wzorzec dla URL nie tak - mam zamiar całą linię, znowu może być wskazówką dla mnie tam!)

Chrome wydaje się zrobić żadnego unescaping z wszelkiego rodzaju, i produkuje konsekwentnie:

# {# &}% 7B% 23% 20% 26% 7D

Firefox substytuty niektóre, ale nie wszystkie znaki o wklejonych z ich non uciekł odpowiedniki, a następnie wytwarza

# {# &} { # &}

a to jest to samo, jeśli w link

Safari (na PC) robi coś przeciwnego: że nie koduje zakodowany nietypowe znaki na pastę, a następnie wytwarza

#% 7B% 23% 20 &% 7D% 7B% 23% 20% 26% 7D

ale po związek jest inny wytwarzania

# {# &}% 7B% 23% 20% 26% 7D

IE9, zadziwiająco, zachowuje się podobnie jak Chrome

IE7 zastępuje rzeczywistą przestrzeń z 20% na paście, ale poza tym pozostawia URL sam, i produkuje

# {#% 20 &}% 7B% 23% 20% 26% 7D

i jeśli klikniesz na link, daje

# {# &}% 7B % 23% 20% 26% 7D


<html> 
<head> 
<title>test</title> 
<script type="text/javascript"> 
function wibble() { 
    document.getElementById("wobble").innerHTML = 
    location.hash.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"); 
} 
</script> 
</head> 
<body onload='wibble()'> 
<div id='wobble'></div> 
<a href='/test.html?new=1#{# &}%7B%23%20%26%7D'>go</a> 
</body> 
</html> 
+0

Pamiętaj, że encje w fragmencie inline JavaScriptu takiego zostanie rozszerzony przez parser HTML, więc kod faktycznie mówi 'location.hash.replace (/ &/g, "&"). Replace (//g ">"); '- prawdopodobnie chcesz użyć' ' –

+0

to był tylko mały skrypt! do przetestowania, nie ma wpływu na wnioski. Jeśli nie masz JS, to raczej nie trafia w sedno. – frankieandshadow

Odpowiedz

5

ABNF w RFC3986 mówi, że fragmenty składają się z pchars - to znaczy są one kodowane procent.

To znaczy, że znaki w identyfikatorach fragment może być dowolny alfanumeryczny lub jeden z

-._ ~ $ & „() * +, =:! @

Wszystkie inne znaki powinny być procent zakodowany.

Powiązane problemy