【问题标题】:PHP include helpPHP 包含帮助
【发布时间】:2011-07-12 06:23:21
【问题描述】:

我需要一些高级文件包含代码方面的帮助。我在 Google 上四处搜索,但我不确定如何以简短的方式描述它以进行搜索。

基本上这里是文件结构:

/public_html/include_handle.php  

/protected_site/index.html
               /images/image.jpg  

如果我使用常规包含语句包含 index.html,则 image.jpg 显然不会显示在浏览器中,因为它不在公共/相对目录中。缺少一些繁重的 preg_match/replace 解析,当包含 index.html 时,如何让图像显示在 include_handle.php 页面上?我还希望能够从 index.html 页面跟踪到其他页面的链接。我知道我可以使用 iframe 并将静态页面放在公共目录中,但出于各种原因我不希望这样做。任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 你安装了gd吗?我可以想到一种过度设计的方法来做到这一点......
  • @Matt Ellen:你不需要 GD 做一个readfile()
  • @Andrew Moore:好点。但是你的方式到底有多过度设计? ;)
  • @Matt Ellen:一个重写规则,一个 PHP 脚本(我假设它受到“某物”的保护),以及一些验证。
  • @Andrew Moore:太容易了! -1 wtf 点。

标签: php include


【解决方案1】:

您可以设置 Apache 别名以在您的公共站点中创建一个“虚拟”目录:

Alias /images /protected_site/images

之后,您面向公众的网页中的任何 /images/ 网址将在内部重定向到受保护网站的图像目录。代价是这会暴露受保护站点的部分文档树,因此您必须小心放入该图像目录中的内容。

【讨论】:

  • 如果当前公共站点图像目录命名相同,这不会干扰它吗?我基本上是在做一个 php include/iframe。
  • 很可能,是的。不确定别名是否优先于物理目录,但大概是这样。但是您可以将别名设置为您想要的任何名称,并将您的 html 指向该名称,而不是 /images 用于那些“特殊”图片。
【解决方案2】:

您可以使用base HTML 标记让您的页面如同位于不同的目录(或主机)中一样工作。将使用此值作为当前文档解析相对链接。

我猜protected_site 无法通过网络访问。您将需要一个 PHP 脚本来读取受保护目录中的文件并将它们发送给用户。它看起来像:

getimage.php?image=image.jpg

如果您不想更改 index.html 的内容并且仍然以something.jpg 而不是上面的方式链接到图像,则可以在服务器端使用 mod_rewrite:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*?\.(jpg|gif|png))$ getimage.php?image=$1 [L]

这样,apache 将为公共目录中不存在的任何图像文件调用您的 PHP。

【讨论】:

  • 如何将重写规则限制在单个页面上?并允许在受保护站点的该页面上导航链接。如果我尝试访问该页面之外的文件,我也希望它会失败。
  • 不,来自其他网站的图片和链接完全不会受到影响,这只适用于您的网站。 - RewriteRule 在服务器上工作,所以不同的服务器有不同的规则。 :)
  • 我不是说来自其他网站。我的意思是来自我的网站。
  • RewriteCond 行确保在找不到此类(真实)文件时应用它。因此,如果您将图像放在public_html 目录中,它将照常提供,但如果浏览器要求提供不存在的图像(在公共目录下),则请求将被指向getimage.php
  • 有趣...当我有更多时间时,我将不得不进一步研究。看起来使用类似于上面的重写规则和 php 处理程序脚本会起作用。谢谢!
【解决方案3】:

第一个解决方案:将图片放到公共文件夹中以便浏览器可以访问它,.html中的链接应该是相对于/public_html

第二种解决方案:通过 php 脚本提供受保护的图像(您需要为浏览器发出正确的标头并使用 readfile 例如传递图像数据) 以 jpg 为例:

header("Content-Type: image/jpeg"); 
readfile("/protected_site/images/image.jpg");

图片链接如下:

image.php?id=image.jpg

【讨论】:

  • 公共部分不是一个选项。所有文件必须保留在只能通过 php 脚本访问的非公共目录中。我不太确定我是否理解这个 readfile 函数。在我看来,我必须用 readfile 替换 index.html 的一部分。我根本不想编辑 index.html。
  • readfile 应该从 $_GET 读取 id 参数并将其放入 readfile 的路径。不要忘记检查从客户端传递的图像文件名中是否没有斜杠等,以避免信息泄露。为了避免修改 index.html,请使用额外的 .htaccess 和 vbence 在他对这个问题的回答中提供的重写规则
猜你喜欢
  • 2010-12-20
  • 1970-01-01
  • 2011-04-26
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 2018-11-06
相关资源
最近更新 更多