Обнаружение, если изображение встроено

Я начал писать свой собственный хост изображений, но у меня есть небольшая проблема:

Я хочу отобразить HTML-страницу, если вы напрямую просматриваете ссылку (например, Domain.com/img/123) через браузер и изображение, если вы вставляете ссылку через

<img src="Domain.com/img/123"> 

для облегчения использования.

Можно ли определить, просматривается ли ссылка непосредственно или ссылка связана с PHP?

Вы можете использовать файл htaccess для этой цели:

Когда браузер загружает встроенное изображение, он уже знает, какой формат ожидать, поэтому он будет добавлять эту информацию в HTTP:Accept заголовки при запросе файла. (или, по крайней мере, уменьшить его до любого типа изображения)

Если браузер напрямую обращается к файлу (url в адресной строке), он не знает этого, поэтому он добавит text/html в HTTP:Accept Header.

Экстракт из хрома:

direct: 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 для обновления кэшированного изображения, будет применяться перенаправление. (Оставьте инструменты отладки открытыми, чтобы отключить кеш)


Обновить

Что касается вашего комментария. Я упустил из виду, что вы хотите использовать искусственный url для представления изображения в любое время. Это изменяет способ разработки htaccess ofc.

Следующий htaccess должен вести себя так, как вы ожидаете:

  • Если запрос Uri заканчивается косой чертой, за которой следуют только цифры (т. /2537263 ), считается, что он имеет право на переписывание.
  • Если это прямой доступ (Http-Accept говорит текст / 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] , пользователи не будут видеть перенаправление, отраженное в 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 embedded -> image.php?id=1234
  • http://localhost/test/image.php?id=1234 -> Возвращает png-изображение.