Определить, встроено ли изображение

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

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

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

чтобы облегчить использование.

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

1

Решение

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

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

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

Выдержка из хрома:

непосредственный: 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 встроенный -> image.php?id=1234
  • http://localhost/test/image.php?id=1234 -> Возвращает png-изображение.
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]