Я генерирую динамические изображения с помощью PHP и использую .htaccess для перенаправления на PHP-скрипт, чтобы использовать эти изображения в HTML-тегах img, например. «/Path/something.jpg».
Вот мой .htaccess:
RewriteEngine On
RewriteBase /
RewriteRule ^/?([a-z]+)/(.*)$ /?a=$1&b=$2 [L,NC]
В результате мой index.php получит «путь» в $ _GET [‘a’] и «нечто.jpg» в $ _GET [‘b’]. Это работает как ожидалось.
Теперь, после создания изображения с помощью PHP, вывод изображения выполняется следующим образом:
header('Content-type: image/jpg');
header('Content-Disposition: filename="something.jpg"');
echo $binary;
exit;
Это также работает, я получаю изображение, браузер отображает его.
НО: при записи журнала всякий раз, когда index.php вызывается для создания изображения, я вижу, что он называется ДВАЖДЫ для каждого создаваемого изображения, и я не могу понять, почему.
Кажется, что с помощью header()
заставит скрипт снова запуститься, потому что удаление header()
из сценария (и просто печать $ двоичного) приведет к выполнению сценария только один раз.
Apache-access.log также показывает второй вызов:
127.0.0.1 - - [18/Sep/2014:12:17:46 +0200] "GET /path/something.jpg HTTP/1.1" 200 19148 "-" "USER_AGENT"127.0.0.1 - - [18/Sep/2014:12:17:46 +0200] "GET /path/something.jpg HTTP/1.1" 200 19148 "-" "USER_AGENT"
Я экспериментировал с настройками .htaccess, чтобы предотвратить это, используя:
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
в моем .htaccess-файле (как показано здесь: Apache mod_rewrite REDIRECT_STATUS условие, вызывающее листинг каталога), но безрезультатно.
Мне также интересно, почему такое поведение не приведет к бесконечному циклу: если .htaccess отправляет запрос в index.php, который выполняет header (), который будет вызывать себя снова, почему это не будет продолжаться вечно, но только дважды ? (в редких случаях даже три раза, но я не смог воспроизвести это)
Любая подсказка о том, почему это происходит (и как это исправить!), Очень ценится. Пока этот скрипт работает, но я бы хотел, чтобы он не генерировал каждое изображение дважды, так как я ожидаю большой нагрузки на сервер после завершения приложения.
Вы не указали, в каком браузере вы это тестировали, но я предполагаю, что это Chrome, так как другие сталкивались с подобными проблемами с ним. Там в этот отчет об ошибке на трекере ошибок Chromium и этот ответ на StackOverflow.
Попробуйте удалить только Content-Disposition
заголовок и посмотрите, правильно ли он работает без этого набора. Вы также можете попытаться указать INLINE
внутри вашего заголовка размещения контента, как это:
header('Content-Disposition: INLINE; FILENAME= "something.jpg"');
и посмотрим, исправит ли это что-нибудь.
Если это не помогает, попробуйте использовать прокси-инструмент веб-отладки (например, Fiddler или Charles) и опубликуйте полные заголовки запроса / ответа для обоих запросов.
Других решений пока нет …