2011-02-08 18 views
30

Podany poniżej wpis SO jest wyczerpujący, ale wszystkie trzy opisane metody nie kodują okresów.Jak kodować okresy dla adresów URL w JavaScript?

postu: Encode URL in JavaScript?

Na przykład, jeśli biegnę trzy metody (tj uciec, encodeURI, encodeURIComponent), żaden z nich koduje okresy.

Tak więc "food.store" wychodzi jako "food.store", który łamie adres URL. Łamie adres URL, ponieważ aplikacja Rails nie może rozpoznać adresu URL jako prawidłowego i wyświetla stronę błędu 404. Być może jest to błąd konfiguracji w pliku tras Railsowych?

Jaki jest najlepszy sposób kodowania okresów w JavaScript dla adresów URL?

+8

W jaki sposób łamie adres URL? Okresy, o ile wiem, nie muszą być zakodowane. – igorw

+0

Dzięki, zaktualizowałem pytanie, aby odzwierciedlić Twoje pytanie. – Crashalot

+0

Dodałem do tagów "ruby-rails" - nie jest to ogólny problem z adresem URL, ale problem z Railsami lub czymś specyficznym dla aplikacji. – Pointy

Odpowiedz

25

Okresy nie powinny łamać adresu URL, ale nie wiem, jak używasz okresu, więc nie mogę powiedzieć. Żadna z funkcji, które znam, nie koduje "." dla adresu URL, co oznacza, że ​​będziesz musiał użyć swojej własnej funkcji do zakodowania "." .

Można kodować dane w base64, ale nie sądzę, że istnieje natywny sposób na zrobienie tego w js. Można również zastąpić wszystkie okresy ich odpowiednikami ASCII (% 2E) po stronie klienta i serwera.

Zasadniczo generalnie nie jest konieczne kodowanie ".", Więc jeśli musisz to zrobić, musisz wymyślić własne rozwiązanie. Możesz również wykonać dalsze testy, aby upewnić się, że "." faktycznie przerwie adres URL.

HTH

+0

Dzięki, zaktualizowałem pytanie, aby odzwierciedlić Twoje pytanie. – Crashalot

+1

@crashalot Myślę, że twoja konfiguracja routingu Railsów musi zostać naprawiona. Nie jestem koleją, ale możliwe, że Rails nie obsługuje okresów. Sprawdź ten adres URL, uważam, że dotyczy on Twojego problemu: http://masonoise.wordpress.com/2010/02/04/rails-routes-with-string-ids-and-periods/ – superultranova

+0

Nie udało mi się znaleźć moje trasy wykorzystywały to hackowe bzdury: Tag.find_by_name (params [: id] + '.' + params [: format]) – rogerdpack

7

Okresy nie muszą być zakodowane w adresach URL. Here to RFC do obejrzenia.

Jeśli kropka coś "zrywa", być może serwer dokonuje własnej interpretacji adresu URL, co oczywiście jest dobre, ale oznacza to, że musisz wymyślić jakiś schemat kodowania własnego, gdy twoje własne metaznaki potrzebują ucieczki.

+0

Dzięki, zaktualizowałem pytanie aby odzwierciedlić twoje pytanie. – Crashalot

46

Wiem, że to stary wątek, ale nie widzę nigdzie tutaj jakieś przykłady adresów URL, które powodowały pierwotnego problemu. Kilka dni temu sam spotkałem się z podobnym problemem z aplikacją Java. W moim przypadku ciąg znaków z kropką znajdował się na końcu elementu ścieżki adresu URL, np.

http://myserver.com/app/servlet/test.string

W tym przypadku, biblioteka Wiosna używam dopiero przechodząc mi „test” część tego łańcucha do odpowiedniej adnotacji parametr metody mojej klasie kontrolera, przypuszczalnie dlatego, że było traktowanie " .string "jako rozszerzenie pliku i usunięcie go. Być może jest to ten sam podstawowy problem z pierwotnym problemem powyżej?

W każdym razie, udało mi się obejść to po prostu przez dodanie ukośnika do adresu URL. Po prostu wyrzucę to na wypadek, gdyby był pożyteczny dla kogokolwiek innego.

John

+2

dzięki, że miałem ten sam problem :) – bdeonovic

+2

Dziękuję! Waliłem głową o ścianę z tym problemem używając .NET WebApi2. Właśnie dodałem końcowy ukośnik i wszystko się wyjaśniło. Dzięki! –

+2

Hmm, to nie działało przy użyciu szyn 3.2; końcowe ukośniki zostają zjedzone jako pierwsze (przed upływem okresu i następującego po nim "typu") Jakieś pomysły? –

1

jeśli jego możliwości za pomocą pliku .htaccess stałaby się naprawdę fajne i łatwe. Po prostu dodaj \ przed okresem. Coś takiego: \.

2

Miałem to samo pytanie i być może moje rozwiązanie może pomóc komuś innemu w przyszłości.

W moim przypadku adres URL został wygenerowany przy użyciu javascript.Okresy są używane do oddzielenia wartości w url (sling selectors), więc selektorzy nie mogli mieć okresów.

Moje rozwiązanie było wymienić wszystkie okresy z podmiotem html jak Rysunek 1:

Rysunek 1: Rozwiązanie

var urlPart = 'foo.bar'; 
var safeUrlPart = encodeURIComponent(urlPart.replace(/\./g, '.')); 

console.log(safeUrlPart); // foo%26%2346%3Bbar 
console.log(decodeURIComponent(safeUrlPart)); // foo.bar 
6

Miałem ten sam problem, gdzie mój .htaccess łamał wartości wejściowe. Ponieważ nie chcemy zmieniać tego, co robił .htaccess Użyłem tego, aby to naprawić:

var val="foo.bar"; 
var safevalue=encodeURIComponent(val).replace(/\./g, '%2E'); 

to robi cały standard kodowania następnie zastępuje. z takim ascii odpowiednikiem% 2E. PHP automatycznie konwertuje z powrotem do. w wartości $ _REQUEST, ale .htaccess nie traktuje tego jako okresu, więc wszystko jest w porządku.

+0

Funkcja escape() również przekonwertuje% 2E z powrotem na pierwotny okres, jest to najlepsza, najbardziej bezpośrednia odpowiedź: – mpoplin

+0

Dla adresów URL zakodowanych w ten sposób przynajmniej na stronie renderowanej, przeglądarki Odkoduj zakodowane okresy wstecz, zanim podążysz za odnośnikami, więc nie rozwiąże to problemu w wielu przypadkach. –

Powiązane problemy