Jak zakodować kropki dla adresów URL w JavaScript?


Poniższy wpis SO jest wyczerpujący, ale wszystkie trzy opisane metody nie są kodowane dla okresów.
Wiadomość:

zakodować adres URL w JavaScript?
https://coderoad.ru/332872/
Na przykład, jeśli uruchomię trzy metody (np. Escape, encodeURI, encodeURIComponent) żadna z nich nie zakoduje okresów.
Tak więc „food.store” pojawia się jako „food.store”, co powoduje uszkodzenie adresu URL. Łamie adres URL, ponieważ aplikacja Railsów nie może rozpoznać adresu URL jako prawidłowego i wyświetla stronę błędu 404. Czy jest to błąd konfiguracji w pliku tras Railsów?
Jaki jest najlepszy sposób kodowania kropek przy użyciu JavaScript dla adresów URL?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wiem, że to stary temat, ale nigdzie nie widziałem tutaj przykładów adresów URL, które powodowały pierwotny problem. Sam miałem podobny problem kilka dni temu z aplikacją Java. W moim przypadku kropkowana linia znajdowała się na końcu elementu ścieżki URL, np.
http://myserver.com/app/servlet/test.string
http://myserver.com/app/servlet/test.string
W tym przypadku biblioteka Spring, której używam, przekazywała mi tylko część „testową” tego ciągu w odpowiednim parametrze metody z adnotacjami mojej klasy kontrolera, prawdopodobnie dlatego, że potraktowała „.string” jako rozszerzenie pliku i usunęła go. Być może jest to ten sam podstawowy problem, co pierwotny problem powyżej?
W każdym razie udało mi się to obejść, po prostu dodając końcowy ukośnik do adresu URL. Po prostu wrzucam to tam na wypadek, gdyby ktoś tego potrzebował.
Jan
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Kropki nie powinny naruszać adresu URL, ale nie wiem, jak używasz kropki, więc naprawdę nie mogę powiedzieć. Żadna ze znanych mi funkcji nie koduje "." Dla adresu URL, co oznacza, że ​​musisz użyć własnej funkcji do kodowania "."
Możesz kodować dane base64, ale nie wierzę, że istnieje natywny sposób na zrobienie tego w js. Możesz również zamienić wszystkie kropki na ich odpowiedniki w ASCII (% 2E) zarówno po stronie klienta, jak i serwera.
Zasadniczo zwykle nie ma potrzeby kodowania „.”, Więc jeśli chcesz to zrobić, będziesz musiał znaleźć własne rozwiązanie. Możesz także przeprowadzić dalsze testy, aby sprawdzić, czy „.” Naprawdę psuje adres URL.
NTN
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Miałem ten sam problem, w którym mój .htaccess łamał wartości wejściowe.
Ponieważ nie chciałem zmieniać tego, co robi .htaccess, użyłem tego, aby to naprawić:
var val="foo.bar";
var safevalue=encodeURIComponent(val).replace(/\./g, '%2E');

robi to wszystkie standardowe kodowanie, a następnie zastępuje. używając tam ascii równoważnego% 2E. PHP jest automatycznie konwertowane z powrotem. w wartości $ _REQUEST, ale .htaccess nie widzi tego jako kropki, więc wszystko jest w porządku.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Kropki nie muszą być zakodowane w postaci adresu URL.

Tutaj
http://tools.ietf.org/html/rfc3986#page-11
RFC, na które warto zwrócić uwagę.
Jeśli kropka jest czymś w rodzaju „zerwania”, Twój serwer może wykonywać własną interpretację adresu URL, co jest w porządku, ale oznacza to, że musisz wymyślić jakiś niestandardowy schemat kodowania, gdy własne metaznaki muszą zostać zmienione. ..
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Miałem to samo pytanie i być może moje rozwiązanie pomoże komuś w przyszłości.
W moim przypadku adres URL został wygenerowany za pomocą javascript. Kropki są używane do oddzielania wartości w adresie URL (

sling selectors
http://sling.apache.org/docume ... n.html), więc sami selekcjonerzy nie mogli mieć kropek.
Moim rozwiązaniem było zastąpienie wszystkich kropek jednostką HTML, jak pokazano na

Postać: jeden

:

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
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Gdyby to było możliwe, użycie pliku .htaccess sprawiłoby, że byłoby to naprawdę fajne i łatwe. Po prostu dodaj \ przed kropką. Coś w rodzaju:
\.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Miałem problemy z .s w adresach URL resztek API. Fakt, że są one interpretowane jako rozszerzenia, ma na swój sposób sens. Ucieczka nie pomaga, ponieważ nie uciekli przed przywołaniem (jak zaznaczono). Dodanie końcowego/też nie pomogło. Obejrzałem to, przekazując zamiast tego wartość jako nazwany argument. na przykład z api/Id/Text.string do api/Id? arg = Text.string. będziesz musiał zmienić routing na kontrolerze, ale sam program obsługi może pozostać taki sam.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To jest problem z szynami

Rails REST routingu: punkty w elemencie zasobów ID
https://coderoad.ru/5222760/
wyjaśnienie (i przewodnik routingu w Railsach, sekcja 3.2)

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się