是否可以确定PHP脚本的输出是用作图像还是完整网站?
我需要这样的东西:
<?php
if(clientRequestedImage()) {
header("Content-Type: image/png");
readfile("image.png");
} else {
readfile("image-wrapped.html");
}
?>
因此,当我稍后使用<img src="script.php">
时,将显示一个图像,当我使用地址栏或链接打开脚本时,将出现一个HTML文档。
我应该如何实现函数clientRequestedImage
?
答案 0 :(得分:3)
免责声明:这只是一种预感,我不确定这是否适用于所有浏览器(应该在最新的Chrome和Firefox中,至少应该是我测试过的)。
您可以解析客户端的Accept
HTTP标头。客户端使用Accept
header来指定浏览器应该向其发送响应的媒体类型。此标头的示例如下:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Chrome和Firefox 似乎在请求常规网站时始终发送Accept: text/html,...
标头,并在加载由{{1嵌入的图片时Accept: image/...
的某些变体标签。
您可以通过<img>
变量在PHP中访问此标头。所以你可能能够做到这样的事情:
$_SERVER['HTTP_ACCEPT']
答案 1 :(得分:1)
大概是可重复使用的,您还需要知道图像名称或要引用的内容,因此可能会出现如下图像标记:
<img src="script.php?image=logo">
然后(这不安全,您需要将获取数据列入白名单或以其他方式消毒):
if(isset($_GET['image'])) {
header("Content-Type: image/png");
readfile($_GET['image'] . "image.png");
} else {
readfile("image-wrapped.html");
}
如果没有,那么就像这样简单:
<img src="script.php?image">
或者:
<img src="script.php?html">
然后检查isset($_GET['image'])
等...
答案 2 :(得分:0)
你没有回答我的两个问题。如果我想要两个不同的 网址,我会使用
<img src="image.png">
和<a href="site.html">
直接..
这条评论让我想到了网址重写。正如你在链接到的文章中提到的那样,HTTP Referrer只有3个选项。就像@AbraCadaver提到的那样,选项3最好,使用URL参数。
如果您坚持在一个脚本中执行此操作,则必须利用URL Rewrite。这允许您屏蔽URL参数。这样你就有了一些条件让PHP知道要呈现什么。
以您的示例为例,当浏览器呈现页面时,它会创建一个HTTP请求,以通过其属性<IMG>
下载标记SRC
指定的图像文件。浏览器为URL创建GET请求,即www.example.com/image.png
,并且可以修改或不修改引用者到标题。 <A>
标记基于href
属性呈现链接,当用户在浏览器中点击此链接时,浏览器会为URL创建GET请求(听起来很熟悉吗?),即{{1 }}
使用URL Rewrite,我们可以检查这两个URL并将流量定向到相同的PHP脚本,在后台调整URL参数。对www.example.com/site.html
的请求可以变为/image.png
,script.php?image=image.png
的请求可以变为/site.html
。