Ресурс URL, который является точкой (% 2E) - PullRequest
23 голосов
/ 04 октября 2010

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

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

Это нормально работает для Firefox. Но все остальные браузеры, такие как IE, Safari, Chrom, Opera просто игнорируют мою точку в кодировке URL (<a href="http://myapp/index/%2E" rel="noreferrer">http://myapp/index/%2E</a>).

Есть предложения?

Ответы [ 2 ]

21 голосов
/ 04 октября 2010

На самом деле в стандарте неясно указано ( RFC 3986 ), должна ли версия с кодировкой в ​​процентах . или .. иметь одинаковую this-folder / up-a-папка, означающая неэкранированную версию.В разделе 3.3 говорится только о «сегментах пути . и ..», не уточняя, соответствуют ли они . и .. до или после кодирования pct.

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

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

11 голосов
/ 21 июля 2014

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

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

...