Php 如何在Apache中同时重写和设置头
我有一个图像目录,可以直接在浏览器中查看,也可以下载 假设我有一个文件/gallery/gal_4254.jpg 我想让/download/gal_4254.jpg触发图像的下载,而不是查看它/下载为空,所有图像都在/gallery中 我可以成功地将下载目录的请求映射到其他文件Php 如何在Apache中同时重写和设置头,php,apache,mod-rewrite,attachment,content-disposition,Php,Apache,Mod Rewrite,Attachment,Content Disposition,我有一个图像目录,可以直接在浏览器中查看,也可以下载 假设我有一个文件/gallery/gal_4254.jpg 我想让/download/gal_4254.jpg触发图像的下载,而不是查看它/下载为空,所有图像都在/gallery中 我可以成功地将下载目录的请求映射到其他文件 <Directory /var/www/download> RewriteEngine on RewriteRule (.*)$ /gallery/$1 </Directory>
<Directory /var/www/download>
RewriteEngine on
RewriteRule (.*)$ /gallery/$1
</Directory>
重新启动发动机
重写规则(.*)$/gallery/$1
我已经可以通过设置
<Directory /var/www/gallery/>
ForceType "image/jpg"
Header set Content-Disposition "attachment"
</Directory>
ForceType“图像/jpg”
标题集内容处置“附件”
因此,设置标题没有问题。不过,我并不希望/gallery包含标题,只希望通过/download/对/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>
#不起作用-只需像直接查看图像一样查看图像
ForceType“图像/jpg”
标题集内容处置“附件”
重新启动发动机
重写规则(.*)$/gallery/$1
我尝试过改变重写和标题部分的顺序,但没有效果。我认为当请求被重写到另一个目录时,它会丢失头
关于如何在Apache中实现这一点,有什么建议吗
我意识到这也可以用PHP实现,这就是为什么我在这里发布它与服务器故障。也欢迎使用PHP的解决方案。组合解决方案可以是以下设置。 首先更改目录项:
<Directory /var/www/download>
RewriteEngine on
RewriteRule (.*)$ download.php?getfile=$1
</Directory>
重新启动发动机
重写规则(.*)$download.php?getfile=$1
php应该包含如下内容(未经测试):
这应该会将所有下载请求重定向到download.php,而download.php会依次处理请求并强制显示saveas对话框
Paul简单的php解决方案:
下载.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>
重新启动发动机
重写规则(.*)$/download.php?img=$1
我只是在无意中理解了你的例子之后才这么做;-)
我很确定,在最新的示例中,您只需将“Directory/var/www/download”部分更改为“Location/download”,就可以了
基本原理是:“目录”适用于重写后生成的物理目录,而“位置”适用于原始URI,无论为查找物理文件而进行的任何重写
由于mod_rewrite是一个在不同时间都适用的巨大黑客行为,因此代码的效果不是很明显
我的workjing设置中的内容是:
<Location /contents/>
Header set Content-Disposition "attachment"
</Location>
...
RewriteRule ^.*(/e-docs/.*)$ $1
标题集内容处置“附件”
...
重写规则^.*(/e-docs/*)$$1
因此,像/contents/myimage.jpg和/contents/e-docs/myimage.jpg这样的URL都会获得内容处置头,即使/contents/e-docs/myimage.jpg实际上是/e-docs/myimage.jpg文件,正如重写所说
因此避免使用PHP还有一个额外的好处,即您可以使用轻量级静态Apache服务器,而不是占用内存的PHP后端进程来提供这些图像和潜在的巨大视频文件(如我的情况)。谢谢!因为你和xaoc相隔2分钟给出了大致相同的答案,我掷了一枚硬币,xaoc接受了。尽管如此,我还是对你投了感谢票。很好的方法,谢谢你添加这个。我希望不用PHP也能做到这一点,特别是因为它看起来确实是一个问题,应该完全可以用Apache解决。
<Location /contents/>
Header set Content-Disposition "attachment"
</Location>
...
RewriteRule ^.*(/e-docs/.*)$ $1