2011-07-18 143 views
2

因此,我正在构建一个需要重定向的应用程序(或者它是否需要重写?我需要做一个URL在客户端保持不变)复制到.php文件中,以查看我的Web服务器(Apache)上给定目录中.pdf文件发生的所有请求。但是,如果用户试图在浏览器中显示PDF(不下载它),我只希望重写此请求。我有一种感觉,第二部分是不可能的。重定向(重写?)Apache服务器上的所有.PDF请求到.php文件

有没有人有一些很好的资源来研究,不仅描述我将需要使用的语法,而且还描​​述了Apache服务器幕后发生的事情?

此外,有没有人有一个想法,我如何可以确定文件是否直接下载或通过网络浏览器请求?我有一种感觉,因为当你通过浏览器访问PDF文件时,它似乎下载它并使用Adobe Reader插件显示它,这两者之间没有区别。

最好的问候,

回答

4
<IfModule mod_rewrite.c> 
    Options +FollowSymLinks 
    Options +Indexes 
    RewriteEngine On 

    # only if not an actual file exist 
    RewriteCond %{REQUEST_FILENAME} !-f 

    # only if not an actual directory exist 
    RewriteCond %{REQUEST_FILENAME} !-d 

    RewriteRule /your-directory/path/(.+)\.pdf $1.php [NC,L] 
</IfModule> 

1.正在改写。

2.查看和下载没有区别。如果您的Apache服务器收到请求,它会给出响应。响应将会是你的PHP脚本将输出的任何内容。更新:@corretge给了你一个与此相关的答案。我认为依赖客户端发送的头文件并不是完全可靠的,但您可以尝试该解决方案。

3.在这里,您可以了解Apache's mode_rewrite

+0

如果OP完全复制您的代码,他将有服务器错误。注释不能在行中间开始。如果** first **非空白字符是'#',则整行被视为注释。在所有其他情况下,它将被视为指令的一部分:http://httpd.apache.org/docs/current/configuring.html#syntax – LazyOne

+0

@LazyOne:谢谢!放置在那里作为解释,但忘记告诉OP删除它们。 – Shef

2

没有测试,但你也可以试试:

RewriteRule ^(.+)\.pdf$ /downloadPdf.php?pdf=$1.pdf [L,NC,QSA] 

而且在与headers_list()如果任何HTTP标头/downloadPdf.php脚本查询这些都存在:

header("Content-Type: application/force-download"); 
header("Content-Type: application/download"); 

如果下载头都存在,发送文件,

header("Content-Disposition: attachment; filename=\"" . stripslashes($this->ubqDoc[$this->camp]['name']) . "\""); 

并强制下载标题。

否则,与此头

header("Content-Disposition: inline; filename=" . stripslashes($this->ubqDoc[$this->camp]['name'])); 

您需要管理其他标题,如:Content-Type和内容Lenght

阅读fpassthru PHP手册关于从PHP发送文件发送文件。

+0

感谢您的意见。虽然这里的信息绝对有用,但其他答案更直接地回答我的问题。 – MoarCodePlz

+0

别担心,但我很好奇:如果PDF是强制下载的,或者如果在浏览器中显示,您会收回不同的标题? – corretge

+0

我还没有测试过,但根据上面的回应,标题略有不同。我会做一些网络嗅探并在这里发布答案。 – MoarCodePlz

相关问题