mod_rewrite
com mod_headers
torna isso possível da seguinte forma:
RewriteEngine on
RewriteCond %{QUERY_STRING} (^|&)download=1(&|$)
RewriteRule ^(.*?([^/]*))$ $1 [E=DOWNLOAD:$2]
Header set "Content-Disposition" "attachment; filename=\"%{DOWNLOAD}e\"" env=DOWNLOAD
Não testou isso com qualquer coisa que contenha não-ASCII ou espaços. Esses provavelmente acabarão mostrando no nome do arquivo escape por URL, ou seja, "% 20", etc.
Edit: caracteres especiais devem funcionar muito bem.
Eu tive que fazer o mesmo no IIS 7.5, então aqui está a maneira de fazer isso: coloque o seguinte XML na seção <system.webServer><rewrite> ...
do site:
<outboundRules>
<rule name="DownloadAnything">
<match serverVariable="RESPONSE_Content_Disposition" pattern=".*" />
<action type="Rewrite" value="attachment" />
<conditions>
<add input="{QUERY_STRING}" pattern="(^|&)download=1(&|$)" />
</conditions>
</rule>
</outboundRules>
(obviamente, se você já tiver um elemento <outboundRules>
, coloque apenas a regra dentro do elemento existente)