Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.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 提供文件时使用.htaccess隐藏目录结构_Php_.htaccess - Fatal编程技术网

Php 提供文件时使用.htaccess隐藏目录结构

Php 提供文件时使用.htaccess隐藏目录结构,php,.htaccess,Php,.htaccess,我通过锚定标签向用户提供.pdf文档。但是,通过锚标记提供完整文档路径会暴露服务器目录结构。以下是一个示例文档位置: mydomain.com//u webstaff/docs/proj03/sub01/111.pdf 我正在尝试创建一个.htaccess,它接受proj03/sub01/111.pdf部分,并重定向到上面的完整URI 那么,HTML将如下所示: View <a href="proj03/sub01/111.pdf">111.pdf</a> <?p

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

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

那么,HTML将如下所示:

View <a href="proj03/sub01/111.pdf">111.pdf</a>
<?php
$f = $_GET['f'];
echo '<meta HTTP-EQUIV="REFRESH" content="0; url=_webstuff/docs/' . $f . '">';
FETCH.PHP如下所示:

View <a href="proj03/sub01/111.pdf">111.pdf</a>
<?php
$f = $_GET['f'];
echo '<meta HTTP-EQUIV="REFRESH" content="0; url=_webstuff/docs/' . $f . '">';
我相信有一个更好的方法

编辑: 我有罪。我的错误是:我必须在FETCH.PHP中的url之前添加斜杠,如下所示:

新FETCH.PHP

<?php
$f = $_GET['f'];
echo '<meta HTTP-EQUIV="REFRESH" content="0; url=/_webstuff/docs/' . $f . '">';
然而。。。我的设计仍然是错误的,因为文档在地址栏中显示了真实的文档路径。也就是说,当.pdf文档显示在浏览器窗口中时,完全限定的URI就在那里,所有人都可以看到。我太聪明了。回到我之前的评论:我相信有更好的方法来做到这一点


建议?

如果您只想匹配某些模式,可以这样做

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。

如果您只想匹配某些模式,可以这样做

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。

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

在linux中—在web根目录中—这类似于:

$ ln -s _webstuff/docs downloads
然后,你所有的网站结构都会在下面下载


这样,您甚至可以在web根目录之外拥有敏感目录,这始终是最安全的解决方案,只需通过http创建指向需要可用的目录的符号链接。

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

在linux中—在web根目录中—这类似于:

$ ln -s _webstuff/docs downloads
然后,你所有的网站结构都会在下面下载


这样,您甚至可以将敏感目录放在web根目录之外(这始终是最安全的解决方案),只需创建一个指向需要通过http访问的目录的符号链接。

如果您不想显示URL结构,则应避免完全重定向

我个人会做的是使用FETCH.PHP页面强制下载文件,然后使用PHP中的readfile函数获取信息

下面是一个我将放在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;
realpathdirname\uuuu文件部分只允许您将服务器文件夹结构添加到该文件中—您应该在其周围添加dirname,直到找到web文件夹的根


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

如果您不想显示URL结构,则应避免完全执行重定向

我个人会做的是使用FETCH.PHP页面强制下载文件,然后使用PHP中的readfile函数获取信息

下面是一个我将放在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;
realpathdirname\uuuu文件部分只允许您将服务器文件夹结构添加到该文件中—您应该在其周围添加dirname,直到找到web文件夹的根


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

我也考虑过这一点,但当文件变得非常大时,这不会起到很好的作用,或者会吗?我不能肯定——我在40-50MB的PDF文件上使用过这样的脚本,没有问题,但我相信它完全取决于服务器的内存限制。这里有一个很好的例子,可以通过将文件分块成较小的大小来克服这个问题,这样服务器就不会超时:我同意Jeroen的观点。这是一段有用的代码,很可能是许多其他情况的理想解决方案。非常感谢分享您的研究成果和辛勤工作。向上投票!我也考虑过这个问题,但当文件变得很大时,这不会很好,或者会吗?我不能肯定-我在40-50MB w的PDF文件上使用过这样的脚本
没问题,但我相信这完全取决于服务器的内存限制。这里有一个很好的例子,可以通过将文件分块成较小的大小来克服这个问题,这样服务器就不会超时:我同意Jeroen的观点。这是一段有用的代码,很可能是许多其他情况的理想解决方案。非常感谢分享您的研究成果和辛勤工作。向上投票!这是使用.htaccess的首选方法,它允许您使用任何您想要的URL结构,然后在服务器上无缝地重写它。这非常棒。谢谢。这是使用.htaccess的首选方法,它允许您使用您想要的任何URL结构,然后在服务器上无缝地重写。这太棒了。谢谢,谢谢杰伦,这是个好主意。一个可以折叠起来沉思的。谢谢杰伦,这是个好主意。一个可以折叠起来沉思的人。