检测图像是否嵌入
Detect if image is embedded
我开始写我自己的图像主机,但我有一个小问题:
如果您通过浏览器直接查看 link(例如域。com/img/123),我想显示一个 HTML 页面,如果您嵌入 link 通过
<img src="Domain.com/img/123">
方便使用。
是否可以检测link是直接查看还是link嵌入了PHP?
您可以为此目的使用 htaccess
文件:
当浏览器加载嵌入图像时,他已经知道期望的格式,因此他会在请求文件时将此信息添加到 HTTP:Accept
headers。 (或至少将其减少到任何 image-type)
如果浏览器直接访问文件(地址栏中的url)他不知道这一点,所以他会添加text/html
到HTTP:Accept
Header .
摘自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= [R,L]
另一个类似 http://localhost/test/test.php
的文件可以正确使用 <img src="http://localhost/test/myimage.gif" />
不会发生重定向,因为不会发送 Accept: text/html
。
请记住,这对 test 有点不利:一旦您将图像嵌入某处,当您直接访问图像时,浏览器缓存将不再加载数据.因此,看起来 直接访问 是可能的。但是,如果您按 F5 键刷新缓存图像,则将应用重定向。
(保持调试工具打开以禁用缓存)
更新
关于你的评论。我忽略了你想用一个人为的 url 来随时呈现图像。这改变了 htaccess 的设计方式。
以下 htaccess 的行为应符合您的预期:
- 如果 Request 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= [R,L]
RewriteCond %{REQUEST_URI} /\d+$
RewriteCond %{HTTP:Accept} !.*text/html.*
RewriteRule ^(.*?)$ http://localhost/test/image.php?id= [R,L]
注意:如果您省略 [R]
选项,用户将看不到 url 中反映的重定向。
我使用的示例页面代码:
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
在浏览器中 -> wrapperpage.php?id=1234
http://localhost/test/1234
嵌入式 -> image.php?id=1234
http://localhost/test/image.php?id=1234
-> Returns png-image.
我开始写我自己的图像主机,但我有一个小问题:
如果您通过浏览器直接查看 link(例如域。com/img/123),我想显示一个 HTML 页面,如果您嵌入 link 通过
<img src="Domain.com/img/123">
方便使用。
是否可以检测link是直接查看还是link嵌入了PHP?
您可以为此目的使用 htaccess
文件:
当浏览器加载嵌入图像时,他已经知道期望的格式,因此他会在请求文件时将此信息添加到 HTTP:Accept
headers。 (或至少将其减少到任何 image-type)
如果浏览器直接访问文件(地址栏中的url)他不知道这一点,所以他会添加text/html
到HTTP:Accept
Header .
摘自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= [R,L]
另一个类似 http://localhost/test/test.php
的文件可以正确使用 <img src="http://localhost/test/myimage.gif" />
不会发生重定向,因为不会发送 Accept: text/html
。
请记住,这对 test 有点不利:一旦您将图像嵌入某处,当您直接访问图像时,浏览器缓存将不再加载数据.因此,看起来 直接访问 是可能的。但是,如果您按 F5 键刷新缓存图像,则将应用重定向。 (保持调试工具打开以禁用缓存)
更新
关于你的评论。我忽略了你想用一个人为的 url 来随时呈现图像。这改变了 htaccess 的设计方式。
以下 htaccess 的行为应符合您的预期:
- 如果 Request 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= [R,L]
RewriteCond %{REQUEST_URI} /\d+$
RewriteCond %{HTTP:Accept} !.*text/html.*
RewriteRule ^(.*?)$ http://localhost/test/image.php?id= [R,L]
注意:如果您省略 [R]
选项,用户将看不到 url 中反映的重定向。
我使用的示例页面代码:
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
在浏览器中 ->wrapperpage.php?id=1234
http://localhost/test/1234
嵌入式 ->image.php?id=1234
http://localhost/test/image.php?id=1234
-> Returns png-image.