使用 htaccess 在标头内设置文件名

Posted

技术标签:

【中文标题】使用 htaccess 在标头内设置文件名【英文标题】:Setting a filename inside the header with htaccess 【发布时间】:2012-03-07 17:20:28 【问题描述】:

我们有一个从服务器下载文件的应用程序。下载后需要保存,因为它使用来自响应头的文件名参数。

当我使用标准 php download.php?id=downloadID 时,我可以毫无问题地设置标题。

现在的任务是在客户端服务器上他们没有任何可用的 php, 我需要在响应头中设置文件名。

这是我所拥有的 htaccess:

<FilesMatch "\.(?i:pdf)$">
    Header set Content-Type: application/octet-stream
    Header set Content-Disposition: "attachment; filename=FILE_NAME.pdf"
</FilesMatch>

而且我不知道如何使用 htaccess 将文件名动态分配到标题中。 我用谷歌搜索了它,但仍然没有解决方案。

有什么建议吗?

【问题讨论】:

【参考方案1】:

我不知道它是否有效,但这是我的第一次尝试。

RewriteRule [^/]+\.pdf$ - [E=FILENAME:$0]
<FilesMatch "\.(?i:pdf)$">
    Header set Content-Type application/octet-stream
    Header set Content-Disposition "attachment; filename=%FILENAMEe" 
</FilesMatch>

EDIT 似乎一些 apache 安装前缀为 env 变量 REDIRECT_

RewriteRule [^/]+\.pdf$ - [E=FILENAME:$0]
Header set Content-Type application/octet-stream env=REDIRECT_FILENAME
Header set Content-Disposition "attachment; filename=%REDIRECT_FILENAMEe" env=REDIRECT_FILENAME

上面的代码不能开箱即用。就我而言,我需要另一个内部重定向。

但是,如果请求 URL 也包含文件名,为什么还需要在标头中设置文件名呢?所有浏览器都会以 URL 中的名称保存文件。所以转到/path/test.pdf 将导致浏览器提示文件名test.pdf

【讨论】:

filename=FILE_NAME.pdf 的实际结果是FILE_NAME.pdffilename=%FILENAMEe 的结果是null 我知道当你直接用文件名调用服务器时,它会得到一个名字......只是当你在项目中有runaway freelancer时你需要做一些部分的项目。关于代码我无法管理它工作(因为我不明白你说它对你有用)。

以上是关于使用 htaccess 在标头内设置文件名的主要内容,如果未能解决你的问题,请参考以下文章

通过 .htaccess 设置过期标头和压缩数据

如何仅在 HTTPS 上从 .htaccess 设置 HSTS 标头 [关闭]

无法使用 Apache 在图像上设置过期标头

未设置 CORS 标头

特定文件的自定义 HTTP 标头

apache_conf WordPress .htaccess配置文件。允许强制SSL,隐藏wp-config.php,标头ETag,GZIP压缩和过期缓存。