如何在没有默认的Accept标头的情况下进行重定向?

时间:2019-05-20 18:51:54

标签: javascript html http browser download

我正在开发一个依赖于客户端的Accept标头的Web应用程序。在协商内容类型时,我的服务器相对于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 个答案:

答案 0 :(得分:1)

您误会了type属性应该做什么。

来自the specification

  

rel,rev,hreflang和type属性可用于在用户跟随链接之前向用户指示目标资源的可能性质。

它告诉浏览器期望纯文本,而不是在Accept标头中使用它。


HTML没有提供控制Accept标头的机制。解决此问题的传统方法是使用不同的URL。

例如:

  • http://example.com/example.html for HTML
  • http://example.com/example.txt用于纯文本
  • http://example.com/example用于内容协商的数据

Apache HTTP具有MultiViews directive用于处理此问题。