Я начал писать свой собственный хост изображений, но у меня есть небольшая проблема:
Я хочу отобразить страницу HTML, если вы непосредственно просматриваете ссылку (например, Domain.com/img/123) через браузер, и изображение, если вы вставляете ссылку через
<img src="Domain.com/img/123">
чтобы облегчить использование.
Можно ли определить, просматривается ли ссылка напрямую или она встроена в PHP?
Вы можете использовать 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 должен вести себя так, как вы ожидаете:
/2537263
) считается приемлемым для переписывания.wrapperpage.php
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-изображение.Других решений пока нет …