Как кодировать периоды для URL в Javascript? - PullRequest
41 голосов
/ 09 февраля 2011

Сообщение SO, приведенное ниже, является всеобъемлющим, но все три описанных метода не могут кодироваться для периодов.

Сообщение: Кодировать URL в JavaScript?

Например, еслиЯ запускаю три метода (т.е. escape, encodeURI, encodeURIComponent), ни один из них не кодирует периоды.

Таким образом, «food.store» выходит как «food.store», который разбивает URL.Он ломает URL, потому что приложение Rails не может распознать URL как действительный и отображает страницу ошибки 404.Возможно, это ошибка конфигурации в файле маршрутов Rails?

Каков наилучший способ кодирования периодов с помощью Javascript для URL?

Ответы [ 8 ]

57 голосов
/ 18 августа 2011

Я знаю, что это старая ветка, но я нигде не видел примеров URL, которые вызывали исходную проблему.Я столкнулся с подобной проблемой сам пару дней назад с приложением Java.В моем случае строка с точкой была в конце элемента пути URL, например.

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

В этом случае библиотека Spring, которую я использую, была толькопередача мне 'тестовой' части этой строки соответствующему аннотированному параметру метода моего класса контроллера, предположительно потому, что он рассматривал '.string' как расширение файла и удалял его.Возможно, это та же самая основная проблема с исходной проблемой выше?

В любом случае, я смог обойти это, просто добавив косую черту в URL.Просто выбросить это на случай, если это пригодится кому-то еще.

Джон

30 голосов
/ 09 февраля 2011

Периоды не должны нарушать URL, но я не знаю, как вы используете период, поэтому я не могу сказать точно. Ни одна из известных мне функций не кодирует '.' для URL, означающего, что вам придется использовать свою собственную функцию для кодирования '.' .

Вы можете кодировать данные с помощью base64, но я не верю, что в js есть родной способ сделать это. Вы также можете заменить все периоды их эквивалентами ASCII (% 2E) как на стороне клиента, так и на стороне сервера.

По сути, обычно нет необходимости кодировать '.', Поэтому, если вам нужно это сделать, вам нужно придумать собственное решение. Вы можете также провести дополнительное тестирование, чтобы убедиться, что '.' на самом деле нарушит URL.

чч

8 голосов
/ 09 февраля 2016

У меня была такая же проблема, когда мой .htaccess ломал входные значения с помощью. Так как я не хотел менять то, что делал .htaccess, я использовал это, чтобы исправить это:

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

это делает все стандартное кодирование, а затем заменяет. с таким же эквивалентом% 2E. PHP автоматически преобразует обратно в. в значении $ _REQUEST, но .htaccess не видит его как точку, поэтому все хорошо.

7 голосов
/ 09 февраля 2011

Точки не должны быть закодированы в URL. Здесь - это RFC, на который нужно смотреть.

Если период «ломает» что-то, возможно, ваш сервер делает свою собственную интерпретацию URL, что является хорошей вещью дляконечно, но это означает, что вы должны придумать собственную схему кодирования, когда ваши собственные метасимволы нуждаются в экранировании.

3 голосов
/ 09 июля 2013

У меня был тот же вопрос, и, возможно, мое решение может помочь кому-то еще в будущем.

В моем случае URL был создан с использованием JavaScript.Периоды используются для разделения значений в URL-адресе ( слинговые селекторы ), поэтому самим селекторам не разрешалось иметь периоды.

Мое решение состояло в том, чтобы заменить все периоды на HTML-сущность какis Рисунок 1 :

Рисунок 1: Решение

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

console.log(safeUrlPart); // foo%26%2346%3Bbar
console.log(decodeURIComponent(safeUrlPart)); // foo.bar
1 голос
/ 23 мая 2013

Если возможно использование файла .htaccess, это сделает его действительно крутым и простым. Просто добавьте \ перед периодом. Что-то вроде: \.

0 голосов
/ 09 июля 2018

У меня были проблемы с .s в url остальных api. Это факт, что они интерпретируются как расширения, что по-своему имеет смысл. Экранирование не помогает, потому что они не покинуты до вызова (как уже отмечалось). Добавление трейлинга / тоже не помогло. Я обошел это, передав значение в качестве именованного аргумента вместо этого. например api / Id / Text.string to api / Id? arg = Text.string. Вам нужно будет изменить маршрутизацию на контроллере, но сам обработчик может остаться прежним.

0 голосов
/ 17 июня 2015

Это проблема рельсов, см. REST-маршрутизация Rails: точки в ID элемента ресурса для объяснения (и Руководство по маршрутизации Rails, раздел 3.2)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...