Я начал писать свой собственный хост изображений, но у меня есть небольшая проблема:
Я хочу отобразить 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 должен вести себя так, как вы ожидаете:
/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
embedded -> image.php?id=1234
http://localhost/test/image.php?id=1234
-> Возвращает png-изображение.