在Apache .htaccess中,set Header set Content-disposition,如何从QUERY_STRING值传递文件名

rqcrx0a6  于 2023-05-01  发布在  Apache
关注(0)|答案(1)|浏览(94)

在Apache .htaccess中,我有以下块强制下载。

<If "%{QUERY_STRING} =~ /fileName=/">
  ForceType application/octet-stream
  Header set "Content-disposition" "attachment; filename=download.doc"
</If>

这个很好用。现在我需要使文件名成为查询字符串键“fileName”的值。
我知道如何在Nginx里做这个。下面是代码。

if ($arg_fileName) {
    set $fname $arg_fileName;
    add_header Content-Disposition 'attachment; filename="$fname"';
}

如何在Apache .htaccess中执行此操作?

zour9fqk

zour9fqk1#

你可以在mod_rewrite的帮助下做这样的事情:

RewriteEngine On

# Save value of fileName URL param in environment variable FILENAME
RewriteCond %{QUERY_STRING} (?:^|&)fileName=([^&]+)
RewriteRule ^ - [E=FILENAME:%1]

# Conditionally set header only if FILENAME is set and use this in the header itself
Header set "Content-Disposition" "attachment; filename=\"%{FILENAME}e\"" env=FILENAME

([^&]+)-但是,请注意,您可能希望限制用于匹配fileName参数 value 的正则表达式,因为HTTP响应头的 filename 参数中不一定允许所有内容。这可以vary by browser and modern browsers do support more。还要注意,从QUERY_STRING中抓取的值已经是URL编码的。所以,也许像([\w.-]+)这样的东西就足以匹配a-zA-Z0-9_.-了?
env=FILENAME参数导致只有当FILENAME env变量存在时才设置header,因此不需要<If>表达式。

ForceType application/octet-stream

这并不是触发 download 的严格必要条件,在任何现代浏览器中,Content-Disposition: attachment头文件都可以触发 * download*。实际上,并不一定推荐为所有响应发送application/octet-stream MIME类型。您应该为正在发送的资源发送正确的Content-Type标头。

相关问题