apache — .htaccess, перенаправляющий на php-файл, который использует header (), будет выполнен дважды

Я генерирую динамические изображения с помощью 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 (), который будет вызывать себя снова, почему это не будет продолжаться вечно, но только дважды ? (в редких случаях даже три раза, но я не смог воспроизвести это)

Любая подсказка о том, почему это происходит (и как это исправить!), Очень ценится. Пока этот скрипт работает, но я бы хотел, чтобы он не генерировал каждое изображение дважды, так как я ожидаю большой нагрузки на сервер после завершения приложения.

0

Решение

Вы не указали, в каком браузере вы это тестировали, но я предполагаю, что это Chrome, так как другие сталкивались с подобными проблемами с ним. Там в этот отчет об ошибке на трекере ошибок Chromium и этот ответ на StackOverflow.

Попробуйте удалить только Content-Disposition заголовок и посмотрите, правильно ли он работает без этого набора. Вы также можете попытаться указать INLINE внутри вашего заголовка размещения контента, как это:

header('Content-Disposition: INLINE; FILENAME= "something.jpg"');

и посмотрим, исправит ли это что-нибудь.

Если это не помогает, попробуйте использовать прокси-инструмент веб-отладки (например, Fiddler или Charles) и опубликуйте полные заголовки запроса / ответа для обоих запросов.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]