2010-03-02 46 views
3

我有一个图像目录,它可以在浏览器中直接查看,也可以在其他时间下载。如何在Apache中同时重写和设置标头

所以,说我有一个文件/gallery/gal_4254.jpg。

我想让/download/gal_4254.jpg触发下载图片而不是查看它。 /下载是空的,所有图像都在/ gallery中。

我可以请求下载目录映射到其他文件成功

<Directory /var/www/download> 
    RewriteEngine on 
    RewriteRule (.*)$ /gallery/$1 
</Directory> 

,我已经可以通过设置

<Directory /var/www/gallery/> 
    ForceType "image/jpg" 
    Header set Content-Disposition "attachment" 
</Directory> 

这样设置标头迫使画廊目录下载是没有问题的。我实际上不希望/ gallery拥有标题,只需要/ gallery/*通过/下载/重写。

但是,我需要结合这两个,所以请求被映射到其他目录中的文件,并且该文件被赋予附件头。

#does not work - just views the image like when it is viewed directly 
<Directory /var/www/download> 
    ForceType "image/jpg" 
    Header set Content-Disposition "attachment" 
    RewriteEngine on 
    RewriteRule (.*)$ /gallery/$1 
</Directory> 

我试着改变重写和标题部分的顺序无济于事。我认为当请求被重写到另一个目录时,它会丢失标题。

有关如何在Apache中执行此操作的任何建议?

我意识到这也可以用PHP来完成,这就是为什么我在这里发布它与服务器故障。使用PHP的解决方案也是受欢迎的。

回答

2

简单的PHP解决方案:

的download.php

header('Content-Type: image/jpeg'); 
header('Content-Disposition: attachment; filename='.$_GET['img']); 
readfile('gallery/'.$_GET['img']); 

的.htaccess

<Directory /var/www/download> 
    RewriteEngine on 
    RewriteRule (.*)$ /download.php?img=$1 
</Directory> 
2

组合解决方案可以是以下设置。 首先更改目录条目:

<Directory /var/www/download> 
    RewriteEngine on 
    RewriteRule (.*)$ download.php?getfile=$1 
</Directory> 

的的download.php应该包含这样的(未测试):

<?php 

if ($_GET['getfile']){ 
    $file = '/var/www/gallery/' . $_GET['getfile']; 
} 

$save_as_name = basename($file); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: no-cache'); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: disposition-type=attachment; filename=\"$save_as_name\""); 

readfile($file); 
?> 

这shouldd重定向所有的下载请求的download.php这又处理请求并强制saveas对话框出现。

保罗

+0

谢谢!既然你和xaoc在2分钟内给出了相同的答案,我翻了一个硬币,并且xaoc得到了接受。尽管如此,你还是有我的赏心悦目。 – JAL 2010-03-03 15:44:17

1

我只是做这个,绊你的例子;-) 后我敢肯定,你只需要改变你的“目录/ var/www /下载“部分添加到最新示例中的”位置/下载“中,您就可以。原理是:“目录”适用于产生的物理目录,发生重写之后,而“位置”适用于原始URI,无论发生任何重写都可以找到物理文件。

由于mod_rewrite是一个适用于各种时间的巨大黑客攻击,因此您的代码的效果不是很明显。

我在我的workjing设置是:

<Location /contents/> 
    Header set Content-Disposition "attachment" 
</Location> 
... 
RewriteRule ^.*(/e-docs/.*)$ $1 

所以像/contents/myimage.jpg和/contents/e-docs/myimage.jpg网址都得到了内容处置头,即使/contents/e-docs/myimage.jpg实际上是/e-docs/myimage.jpg文件,正如重写所述。

为此避免使用PHP具有额外的好处,您可以使用轻量级静态Apache服务器而不是PHP内存后端进程为这些图像和潜在的巨大视频文件提供服务。

+0

伟大的方法,谢谢你添加这个。我很乐意在没有PHP的情况下这样做,尤其是因为它看起来像是一个应该完全可以用Apache解决的问题。 – JAL 2010-07-08 18:34:45