1

我通过锚标签向用户提供 .pdf 文档。但是,通过锚标记提供完整的文档路径会暴露服务器目录结构。这是一个示例文档位置:mydomain.com/_webstuff/docs/proj03/sub01/111.pdf

我正在尝试创建一个接受“proj03/sub01/111.pdf”部分的 .htaccess,并重定向到上述完整 URI。

那么,HTML 将如下所示:

View <a href="proj03/sub01/111.pdf">111.pdf</a>

这是不工作的htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /fetch.php?f=$1

FETCH.PHP 看起来像这样:

<?php
$f = $_GET['f'];
echo '<meta HTTP-EQUIV="REFRESH" content="0; url=_webstuff/docs/' . $f . '">';

我确信有更好的方法来做到这一点。

编辑:MEA CULPA。我的错误是这样的:我必须在 FETCH.PHP 中的 url 之前添加一个斜杠,如下所示:

新的 FETCH.PHP

<?php
$f = $_GET['f'];
echo '<meta HTTP-EQUIV="REFRESH" content="0; url=/_webstuff/docs/' . $f . '">';

但是...我的设计仍然是错误的,因为该文档在地址栏中显示了真实的文档路径。也就是说,当 .pdf 文档显示在浏览器窗口中时,全限定 URI 就在那里供所有人查看。我太聪明了一半。回到我之前的评论:“我确信有更好的方法来做到这一点。”

建议?

4

3 回答 3

4

如果您只想匹配一些模式,就可以了。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9]*)/([a-z0-9]*)/([a-z0-9]*).pdf$ /_webstuff/docs/$1/$2/$3.pdf [NC,L]

这将匹配/projNum/subNum/filename.pdf并重写 URI。对于这种重写,查看者不会看到重写的 URI。

于 2012-09-05T22:23:47.863 回答
2

如果您不想显示您的 URL 结构,那么您应该避免完全重定向。

我个人会做的是使用 FETCH.PHP 页面强制下载文件 - 并且只需使用readfile()PHP 中的函数来获取信息。

这是我将在 FETCH.PHP 页面上放置的示例(显然,这需要一些条件和检查等等,但它给了你一个想法)

$pdf_filename = "name-of-pdf-user-will-see.pdf";
ob_end_clean();
ob_start();
header('Pragma: public');
header('Expires: 0');
header ("Cache-Control: max-age=0, must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header("Content-Type: application/octet-stream");
header('Content-Length: ' . filesize(realpath(dirname(__FILE__))."_webstuff/docs/".$f));
header("Content-Disposition: attachment; filename=\"$pdf_filename\"");
readfile(realpath(dirname(__FILE__))."_webstuff/docs/".$f);
ob_flush();
exit;

realpath(dirname(__FILE__))部分只允许您获取该文件的服务器文件夹结构 - 您应该dirname()在它周围添加,直到您到达您的 Web 文件夹的根目录。

使用这种方法,您根本不需要显示文件的路径,并且单击页面上的锚链接不会进行任何重定向,它只会强制下载文件,用户甚至都不知道他们是被重新路由。

于 2012-09-05T22:25:02.550 回答
1

我不知道你为什么需要隐藏你的目录结构,但是没有 php 的简单解决方案是在下载部分的根目录上创建一个符号链接。

在 linux - 在 web-root 目录中 - 这将是这样的:

$ ln -s _webstuff/docs downloads

然后您下面的所有站点结构_webstuff/docs也将在下面可用downloads

这样,您甚至可以在 web-root 之外拥有敏感目录,这始终是最安全的解决方案,并且只需对需要通过 http 可用的目录进行符号链接。

于 2012-09-05T22:24:23.047 回答