我正在开发一个依赖于客户端的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>
这不是最终的解决方案,必须有更好的方法!
答案 0 :(得分:1)
您误会了type
属性应该做什么。
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用于处理此问题。