Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Apache中同时重写和设置头_Php_Apache_Mod Rewrite_Attachment_Content Disposition - Fatal编程技术网

Php 如何在Apache中同时重写和设置头

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>

我有一个图像目录,可以直接在浏览器中查看,也可以下载

假设我有一个文件/gallery/gal_4254.jpg

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

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

<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