Должен ли атрибут данных тега объекта быть закодирован в процентах?

StackOverflow https://stackoverflow.com/questions/5497516

Вопрос

Предположим, мое веб-приложение отображает следующий тег:

<object type="application/x-pdf" data="http://example.com/test%2Ctest.pdf">
     <param name="showTableOfContents" value="true" />
     <param name="hideThumbnails" value="false" />
</object>

Должен data атрибут должен быть экранирован (путь в процентном кодировании) или нет?В моем примере это так.Никаких спецификаций я не нашел.

дополнение

На самом деле, меня интересует спецификация того, что должны потреблять плагины браузера. data атрибут ожидайте увидеть там.Например, плагин Adobe Acrobat принимает как экранированные, так и неэкранированные URI.Однако, QWebPluginFactory лечит data атрибут как удобочитаемый URI (неэкранированный), что приводит к двойному процентному кодированию.И мне интересно, является ли это ошибкой QWebPluginFactory или нет.

Это было полезно?

Решение

А data атрибут ожидает, что значение будет URI.Поэтому вам следует предоставить значение, которое является синтаксически допустимым URI.

Текущая спецификация URI: РФК 3986.Чтобы увидеть, , в пути URI необходимо закодировать, посмотрите, как путь правило производства определяется:

path          = path-abempty    ; begins with "/" or is empty
              / path-absolute   ; begins with "/" but not "//"
              / path-noscheme   ; begins with a non-colon segment
              / path-rootless   ; begins with a segment
              / path-empty      ; zero characters

Поскольку у нас есть URI с власть информацию, нам нужно взглянуть на Путь-пустой (видеть URI правило производства):

path-abempty  = *( "/" segment )

сегмент равен нулю или больше pchar символов, который определяется следующим образом (правила производства я уже расширил):

pchar         = ALPHA / DIGIT / "-" / "." / "_" / "~" / "%" HEXDIG HEXDIG / "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" / ":" / "@"

И как вы можете видеть, pchar расширяется до буквального ,.Поэтому вам не нужно кодировать , в путь компонент.Но поскольку вам разрешено кодировать любой неразграничивающий символ, используя процентную кодировку, не меняя его значения, можно использовать %2C вместо ,.

Другие советы

URL-адреса обычно могут содержать только определенные символы.К сожалению, разные спецификации содержат разные списки символов, которые считаются зарезервированными и поэтому не могут использоваться.

В вашем примере закодированный символ представляет собой запятую (,), который в некоторых спецификациях является зарезервированным символом, поэтому его кодирование не является ошибкой.

Большинство веб-серверов должны одинаково обрабатывать как незакодированные, так и закодированные запятые, однако некоторые из них могут этого не делать, в зависимости от их конфигурации.В связи с этим, как правило, рекомендуется избегать использования специальных символов в именах файлов (как в вашем примере).

Кодирование URL-адреса всегда необходимо, если в параметрах GET есть специальные символы.Например, параметр GET, который можно принять C&A в качестве значения должно быть записано как:

http://example.com/somescript.php?value=C%26A

РЕДАКТИРОВАТЬ:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top