Подтвердить что ты не робот

Ресурс url, который является точкой (% 2E)

У меня есть ресурс, который является . Это означает, что мой url выглядит так: http://myapp/index/. И мне нужно добавить параметры запроса, чтобы он выглядел так: http://myapp/index/.?type=xml Я использую Freemarker для представления моих ресурсов и сделал взлом для кодирования процентов для этого случая:

<#if key?matches("\\.")>
<li><a href="${contextPath}/index/%2E">${key}</a></li>
</#if>

Это отлично работает для Firefox. Но все другие браузеры, такие как IE, Safari, Chrom, Opera, просто игнорируют мою кодированную url точку (http://myapp/index/%2E).

Любые предложения?

4b9b3361

Ответ 1

На самом деле на самом деле не совсем четко указано в стандарте (RFC 3986), является ли процентная кодировка версии . или .. Предположим, что у вас есть такая же папка-папка/вверх-папка, что и в виде невыпадающей версии. В разделе 3.3 говорится только о сегментах пути . и .. ", не уточняя, соответствуют ли они . и .. до или после pct-кодирования.

Лично я считаю интерпретацию Firefox, что %2E не означает . наиболее практичный, но, к сожалению, все другие браузеры не согласны. Это означает, что вы не можете иметь компонент пути, содержащий только . или ...

Я думаю, что единственное возможное предложение - "не делай этого"! Есть и другие компоненты пути, которые также являются сложными, как правило, из-за ограничений сервера: %2F, %00 и %5C последовательности в путях также могут блокироваться некоторыми веб-серверами, а пустой сегмент пути также может вызывать проблемы. Таким образом, в общем случае невозможно установить все возможные байтовые последовательности в компонент пути.

Ответ 2

Это невозможно. §2.3 говорит, что "." является безоговорочным символом и что "URI, которые отличаются заменой безоговорочного символа на соответствующий процентный кодированный октет US-ASCII, эквивалентны". Поэтому /%2E%2E/ совпадает с /../, и это нормализуется.

(Это комбинация ответа bobince и комментария slowpoison.)