Немного неясно, что вы подразумеваете под «перенаправлением на себя».Есть ли какая-то причина, по которой ваш download.php не может использовать CURL для захвата изображения с удаленного сервера и последующей его обработки, используя образец кода таким же образом?Зачем ему нужно перенаправлять?
Лучше не использовать движок PHP для обслуживания изображений, если этого можно избежать, поскольку Apache может сделать это гораздо эффективнее сам по себе.Вы также теряете часть поведения Apache по умолчанию, например, ваш пример кода не отправляет последние измененные заголовки и не обрабатывает etags, поэтому, если пользователь повторно посетит ту же страницу, он в конечном итоге снова загрузит изображение вместо использования кэшированной версии.
Ваш предложенный альтернативный подход будет немного лучше, поскольку, как только ваш скрипт загрузит изображение в первый раз, все последующие запросы будут обрабатываться Apache напрямую.Просто убедитесь, что вы не отправляете 404 заголовка вместе с изображением.
В качестве альтернативы можно проверить, существуют ли файлы с помощью htaccess, так что вы можете только перенаправить запросы на несуществующие изображения в download.php и не иметьизменить свой 404 скрипт.Примерно так (не проверено):
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/images
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^.*$ download.php [NC,L]
это означает, что если REQUEST_URI начинается с / images, а имя файла не соответствует существующему файлу в файловой системе, перепишите его в файл download.php.
Я бы также порекомендовал изучить X-Sendfile, модуль Apache, который позволяет очень легко обслуживать изображения (и другие двоичные данные).Использовать его в PHP так же просто, как отправить заголовок, содержащий путь к файлу:
header("X-Sendfile: /home/whatever/public/images/something.jpg");
Затем Apache сделает всю остальную работу за вас - считывая и выводя содержимое файла и отправляя все соответствующиезаголовки.Модуль обычно не включен по умолчанию, поэтому вам может потребоваться установить его или проверить у своего хоста.