检测图像是否嵌入

时间:2015-04-02 13:14:57

标签: php image detection

我开始编写自己的图像主机,但我有一点问题:

如果您通过浏览器直接查看链接(例如Domain.com/img/123),我想显示HTML页面;如果您通过

直接查看链接,则显示图像
<img src="Domain.com/img/123">

促进使用。

是否可以检测链接是否被直接查看或链接是否嵌入了PHP?

1 个答案:

答案 0 :(得分:4)

您可以使用htaccess文件来实现此目的:

当浏览器加载嵌入的图像时,他已经知道了期望的格式,因此他会在请求文件时将此信息添加到HTTP:Accept标题中。 (或至少将其缩小为任何图像类型)

如果浏览器正在直接访问文件(地址栏中的网址),则他不知道这一点,因此他会将text/html添加到HTTP:Accept标题。

从chrome中提取:

直接:Accept text/html, application/xhtml+xml, */*

嵌入式:Accept image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5

使用此信息来捕获直接访问案例:以下示例将http://localhost/test/myimage.gif上的访问重定向到index.php?url=/test/myimage.gif

RewriteEngine on

RewriteCond %{REQUEST_URI} .*\.gif        # redirect gifs
RewriteCond %{REQUEST_URI} !.*index\.php  # make sure there is no loop
RewriteCond %{HTTP:Accept} .*text/html.*  # redirect direct access
RewriteRule (.*) http://localhost/test/index.php?url=$1 [R,L]  

http://localhost/test/test.php等其他文件可以正常使用<img src="http://localhost/test/myimage.gif" />不会发生重定向,因为不会发送Accept: text/html

请记住,这对测试来说有点不好:一旦将图像嵌入某处,当您直接访问图像时,浏览器缓存将不再加载数据。因此,它看起来像直接访问是可能的。但是,如果您按F5刷新缓存的图像,则将应用重定向。 (保持调试工具处于打开状态以禁用缓存)


更新

关于你的评论。我忽略了你想用一个人工网址随时呈现图像。这改变了设计htaccess ofc的方式。

以下htaccess的行为应符合您的预期:

  • 如果请求Uri以斜杠结尾,后跟数字(即/2537263),则认为它有资格重写。
  • 如果是直接访问(Http-Accept说 text / html ),则会重写为wrapperpage.php
  • 如果是嵌入式访问(HTTP-Accept说 * text / html),则会重写为image.php

htaccess的:

RewriteEngine on

RewriteCond %{REQUEST_URI} /\d+$   
RewriteCond %{HTTP:Accept} .*text/html.*  
RewriteRule ^(.*?)$ http://localhost/test/wrapperpage.php?id=$1 [R,L]

RewriteCond %{REQUEST_URI} /\d+$   
RewriteCond %{HTTP:Accept} !.*text/html.*      
RewriteRule ^(.*?)$ http://localhost/test/image.php?id=$1 [R,L]

注意:如果您省略[R]选项,则用户将看不到网址中反映的重定向。

我使用的示例页面代码:

wrapperpage.php:

THIS IS MY WRAPPER PAGE: 

<br />                   
<img src = "http://localhost/test/<?=$_GET["id"]?>" />
<br />

IMAGE IS WRAPPED.

image.php(你确定图片的逻辑在那里我假设)

<?php

//Load Image
$id = $_GET["id"];

//pseudoloading based on id... 
// loading... 
// done. 
$image = imagecreatefromgif("apache_pb.gif"); 

//output image as png.
header("Content-type: image/png");
imagepng($image);

?>

所以:

    浏览器中的
  • http://localhost/test/1234 - &gt; wrapperpage.php?id=1234
  • http://localhost/test/1234嵌入式 - &gt; image.php?id=1234
  • http://localhost/test/image.php?id=1234 - &gt;返回png-image。