Как перенаправить без заголовка Accept по умолчанию? - PullRequest
0 голосов
/ 20 мая 2019

Я занимаюсь разработкой веб-приложения, которое опирается на заголовок Accept клиента.При согласовании типа контента мой сервер предпочитает text/plain вместо text/html.

. Я хочу добавить кнопку загрузки на страницу HTML, которая перенаправляет на страницу, которая просматривается в данный момент.На этот раз запрашиваем вариант text/plain;сервер установит заголовок Content-Disposition, инициирующий загрузку.

Проблема заключается в том, что, например, Firefox полностью игнорирует атрибут type в ссылках, который должен делать именно это. Пример:

<a href=/ type=text/plain>Download</a>
GET /
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
GET /
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Последний запрос от нажатия ссылки на скачивание, и там нет text/plain.

Мне удалось создатьобходной путь с JavaScript, но в лучшем случае он уродлив:

<a id=download download href=#>Download</a>
<script>
  document.getElementById("download").onclick = 
    async () => {
      // send the request manually instead of redirecting directly
      const res = await fetch(window.location, { headers: { "Accept": "text/plain" } });
      const text = await res.text();

      // redirect to the file in memory
      const file = new File([text], "hello.txt", { type: "application/octet-stream" });
      window.location.assign(window.URL.createObjectURL(file));
    };
</script>

Это не может быть окончательным решением, должен быть лучший способ!

1 Ответ

1 голос
/ 21 мая 2019

Вы ошибаетесь в отношении того, что должен делать атрибут type.

С Спецификация :

Атрибуты rel, rev, hreflang и type могут использоваться для указания пользователю вероятной природы целевого ресурса до того, как пользователь перейдет по ссылке.

Он сообщает браузеру ожидать простого текста, а не отдавать предпочтение в заголовке Accept.


HTML не предоставляет механизма для управления заголовком Accept. Традиционный подход к этой проблеме заключается в использовании разных URL.

Например:

Apache HTTP имеет директиву MultiViews для обработки этого.

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