Facebook Передача аргументов в файлы JPG и отображение пользовательских изображений

Я заметил в исходном коде Facebook , что изображения – это ссылки на файл PHP , safe_image.php (или rsrc.php ; время от времени меняется), причем имя выбранного файла добавляется до конца, такое в виде:

https://external-lax3-2.xx.fbcdn.net/safe_image.php?imagename1234

Или иногда это обычные файлы JPEG со случайным токеном, добавленным до конца:

https://scontent-lax3-2.xx.fbcdn.net/v/t1.0-9/17353408_410522555967800_2778489440067836960_n.jpg?oh=3e00f84c6767364c9304b34f8751114d&oe=5954DA1E

Что, мне интересно, как они получают пользовательский просмотрщик изображений на своем веб-сайте. Обычно это просто белый фон, с выбранным изображением в верхнем левом углу. Тем не менее, они устанавливаются посередине с серым фоном.

Не только это, связанное изображение прямо возвращается к просмотренному файлу PHP ; как это возможно, и как они это делают?

Приветствия.

EDIT : Я также заметил, что если вы измените img src на недопустимую ссылку, он выведет на страницу ошибку:

Изображение « Вставить ссылку на изображение здесь » невозможно отобразить, так как оно содержит ошибки.

Файлы Jpeg, ни для кого не удивляют, не принимают аргументов. Тем не менее, PHP делает. Так что, скорее всего, Facebook сделал это правило rewrite чтобы «сопоставить» их .jpg?= URL-адрес файла PHP, который может обрабатывать аргументы. Затем этот файл PHP извлекает данные изображения из таблицы MYSQL (например). Если вам интересно, да, вы можете иметь отображение расширения файла .jpg в URL, загружать данные с PHP и правильно отображать изображение в браузере.

Это может быть достигнуто с помощью PHP и .htaccess .

Во-первых, давайте /img.jpg?= наш .htaccess внутри любой папки, в которой хотим иметь наш /img.jpg?= внутри:

 Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^img.jpg(.*)$ imageBackground.php$1 [NC] 

Yay, теперь мы сопоставляем наш img.jpg?image=bill to imageBackground.php?image=bill .

И тогда мы собираемся написать наш imageBackground.php . Я написал очень простой, но в основном все, что вы делаете, это настройка заголовков (для которых используется формат изображения), а также отображение данных изображения. Очевидно, что в практическом применении это будет сложнее, например, возможно, вы динамически захватываете данные изображения из базы данных (например, Facebook ).

 <?php if ($_GET['image'] == "bill") { header("Content-type: image/pjpeg"); echo file_get_contents("bill.jpg"); } ?>