Кодировка URL с подчеркиванием в имени каталога? - PullRequest
7 голосов
/ 08 февраля 2010

Мы столкнулись со странным аргументом, когда я работаю, и я могу ошибаться в этом, поэтому я и спрашиваю.

Наше программное обеспечение выводит каталог на сервер Apache, который заменяет подчеркивание на% 5F в имени каталога.

Например, если имя каталога было указано в виде строки в нашем программном обеспечении, это будет: «andy_test», но тогда, когда программное обеспечение выведет каталог на сервер Apache, оно станет «andy% 5Ftest». К сожалению, когда вы получаете доступ к URL на сервере, он становится «andy% 255Ftest».

Почему-то мне это кажется неправильным, еще раз:

  1. andy_test <- (как строка в программном обеспечении) </li>
  2. andy% 5Ftest <- (указан на сервере как каталог) </li>
  3. andy% 255Ftest <- (должен использоваться при вызове того же каталога, что и URL на сервере из веб-браузера.) </li>

Я предполагаю, что "% 5" кодирует подчеркивание, а "% 25" кодирует "%".

Теперь мне кажется, что путь, по которому имя каталога должно быть указано на сервере, было бы просто andy_test, и если бы вы использовали закодированный URI, то, возможно, в итоге вы получите «andy% 5Ftest» для доступа каталог на сервере apache.

Я спросил об этом ребят из бэкэнда, и они сказали, что они просто: «кодируют все, что не является буквой или цифрой.

Так что, думаю, я немного запутался в этом. Можете ли вы сказать мне, кто прав, и указать мне, почему?

Ответы [ 2 ]

11 голосов
/ 08 февраля 2010

Вы не должны кодировать имена каталогов при их создании (как вы предлагали). Кодирование должно происходить только на последнем этапе, когда оно передается в браузер. Вот почему вы получаете двойную кодировку:% 25 - это%, а 5F - остаток от первой кодировки подчеркивания.

Также обратите внимание, что вам не нужно кодировать подчеркивания в соответствии с rfc1738 .

2,2. Проблемы кодировки символов URL

...

Таким образом, только буквенно-цифровые символы, специальные символы "$ -_. +! * '()," И зарезервированные символы, используемые в зарезервированных целях, могут быть использованы незакодированный внутри URL.

3 голосов
/ 08 февраля 2010

В том, что вы показываете, происходит двойное кодирование. Два шага должно быть достаточно:

andy_test - это и строка в программном обеспечении, и фактическое имя каталога или сценария в файловой системе (ресурс, к которому обращается веб-сервер)

andy%5Ftest является andy_test URL-кодированным. Эта строка должна использоваться браузером (в действительности это не нужно в подчеркивании, но может быть и в других случаях).

andy%255ftest - это просто andy_test URL, закодированный дважды, что не имеет смысла, в этом нет необходимости. Просто решите, ГДЕ вы будете делать кодировку. Если вы делаете это как на уровне кода, так и на уровне веб-сервера, это может произойти, и в результате вы получите неработающие ссылки, если только вы не расшифруете их дважды, что на самом деле не нужно и не является нормальным.

...