Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.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
将Apache服务器上的所有.PDF请求重定向(重写?)到.php文件_Php_Apache_Pdf_Mod Rewrite_Redirect - Fatal编程技术网

将Apache服务器上的所有.PDF请求重定向(重写?)到.php文件

将Apache服务器上的所有.PDF请求重定向(重写?)到.php文件,php,apache,pdf,mod-rewrite,redirect,Php,Apache,Pdf,Mod Rewrite,Redirect,因此,我正在构建一个应用程序,它需要将web服务器(Apache)上给定目录中的.pdf文件的所有请求重定向(或者重写?我需要在客户端执行URL保持不变的操作)到.php文件。但是,我只希望在用户试图在浏览器中显示PDF(而不是下载)时重写此请求。我觉得第二部分是不可能的 是否有人有一些好的资源来研究,这些资源不仅描述了我需要使用的语法,而且还描述了Apache服务器的幕后情况 另外,有人知道我如何确定文件是直接下载还是通过web浏览器请求的吗?我有一种感觉,因为当你通过浏览器访问PDF文件时,

因此,我正在构建一个应用程序,它需要将web服务器(Apache)上给定目录中的.pdf文件的所有请求重定向(或者重写?我需要在客户端执行URL保持不变的操作)到.php文件。但是,我只希望在用户试图在浏览器中显示PDF(而不是下载)时重写此请求。我觉得第二部分是不可能的

是否有人有一些好的资源来研究,这些资源不仅描述了我需要使用的语法,而且还描述了Apache服务器的幕后情况

另外,有人知道我如何确定文件是直接下载还是通过web浏览器请求的吗?我有一种感觉,因为当你通过浏览器访问PDF文件时,它似乎是下载并使用Adobe Reader插件显示的,所以两者之间没有区别

致以最诚挚的问候,


<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>
选项+FollowSymLinks 选项+索引 重新启动发动机 #仅当不存在实际文件时 重写cond%{REQUEST_FILENAME}-F #仅当不存在实际目录时 重写cond%{REQUEST_FILENAME}-D 重写规则/your directory/path/(.+)\.pdf$1.php[NC,L]
一,。这是重写

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


三,。在这里,您可以了解未测试的

,但也可以尝试:

RewriteRule ^(.+)\.pdf$  /downloadPdf.php?pdf=$1.pdf [L,NC,QSA]
在/downloadPdf.php脚本中,查询带有标题的HTTP标题。\u list(),如果存在这些标题中的任何一个:

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']));
您需要管理其他标题,如内容类型和内容长度


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

如果OP准确复制您的代码,他将出现服务器错误。注释不能在行的中间开始。如果第一个非空白字符是
#
,则整行将被视为注释。在所有其他情况下,它将被视为指令的一部分:@LazyOne:谢谢!将它们放在那里进行解释,但忘记告诉OP删除它们。感谢您的输入。虽然这里的信息绝对有用,但另一个答案更直接地回答了我的问题。别担心,但我很好奇:如果PDF是强制下载的,或者如果在浏览器中显示,您会收到不同的标题?我还没有测试确认,但根据上面的回答,标题略有不同。我会做一些网络嗅探,并在这里发布答案。