Исправление.htaccess при обслуживании изображений через PHP
Поэтому я пытаюсь перенаправить все запросы изображений с моего сервера, чтобы использовать собственный скрипт PHP. Скрипт PHP встроен в фреймворк, доступ к которому можно получить через http://www.domain.com/images/imageNameHere.jpg. Пользователь, очевидно, не знает, что изображение предоставляется им. Так что теперь проблема в том, что этот метод в настоящее время работает для его верхнего уровня, но для серверной части он вызывает много проблем. Например, если я пытаюсь использовать другую функцию PHP, такую как getimagesize() на этом изображении, я получаю сообщение об ошибке, что он не может открыть поток.
Заглядывая дальше, я заметил, что все заголовки для этих изображений генерируют 404 не найденных ошибки. (Обнаружил это с помощью онлайн-инструментов обнаружения заголовков, а затем увидел в error_log, что каждое загруженное изображение приводит к ошибке 404 not found). Нет необходимости говорить, что этого не может быть, и мне нужно, чтобы все запросы составляли 200. Я чувствую, что это поможет решить проблему.
Это мой текущий файл.htaccess, я не совсем уверен, как настроить его так, чтобы эти изображения проходили через систему и не обрабатывали их как файл, а скорее как URI:
# Turn on URL rewriting
RewriteEngine On
# Installation directory
RewriteBase /
# Protect hidden files from being viewed
<Files .*>
Order Deny,Allow
Deny From All
</Files>
RewriteCond %{HTTP_HOST} ^i.tinyuploadz.com
RewriteRule (.*) http://www.tinyuploadz.com/images%{REQUEST_URI} [NC,L,NS]
# Protect application and system files from being viewed
RewriteRule ^(?:application|modules|system)\b.* index.php/$0 [L]
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Image rediects?
#RewriteRule /images/(.+)\.jpg /images/$1.jpg [PT]
# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]
# Fix the CSS an d JS
#RewriteRule ^(.*)\.[\d]{10}\.(css|js)$ $1.$2 [L]
# Do not let people browse our directories
Options -Indexes
Вот как я сейчас настроил свою функцию PHP (это представление, сгенерированное контроллером)
$day = date("d", $image['upload_time']);
$month = date("m", $image['upload_time']);
$year = date("Y", $image['upload_time']);
$url = IMAGE_URL . $year . '/' . $month . '/' . $day . '/' . $image['image_id'] . '.' . $image['extension'];
header('Content-type: ' . $image['mime']);
switch ($image['extension'])
{
case 'png':
$img = @imagecreatefrompng($url);
imagepng($img);
imagedestroy($img);
break;
case 'jpg':
case 'jpeg':
$img = @imagecreatefromjpeg($url);
imagejpeg($img);
imagedestroy($img);
break;
case 'gif':
if (is_ani($url))
{
readfile($url);
break;
}
$img = @imagecreatefromgif($url);
imagegif($img);
imagedestroy($img);
break;
case 'bmp':
// Seems like we can't do anything special for bmps
readfile($url);
break;
default:
readfile($url);
break;
}
//readfile($url . $image['image_id'] . '.' . $image['extension']);
// We don't want Kohana to break anything else with the header change
exit();
function is_ani($filename)
{
if(!($fh = @fopen($filename, 'rb')))
return false;
$count = 0;
//an animated gif contains multiple "frames", with each frame having a
//header made up of:
// * a static 4-byte sequence (\x00\x21\xF9\x04)
// * 4 variable bytes
// * a static 2-byte sequence (\x00\x2C) (some variants may use \x00\x21 ?)
// We read through the file til we reach the end of the file, or we've found
// at least 2 frame headers
while(!feof($fh) && $count < 2)
{
$chunk = fread($fh, 1024 * 100); //read 100kb at a time
$count += preg_match_all('#\x00\x21\xF9\x04.{4}\x00(\x2C|\x21)#s', $chunk, $matches);
}
fclose($fh);
return $count > 1;
}
Спасибо за любую помощь по этому вопросу:)
2 ответа
Попробуйте изменить это:
#RewriteRule /images/(.+)\.jpg /images/$1.jpg [PT]
К этому:
RewriteRule /images/(.+)\.jpg /images/$1.jpg [PT,L]
Я подозреваю, что Apache анализирует правило перезаписи, но затем фильтрует его только на RewriteRule .* index.php/$0 [PT]
строка, так что в конце она действительно передает все в index.php.
HTTP-запрос не должен иметь значения... Потому что когда getimagesize извлекает изображение, оно аналогично другому браузеру. Убедитесь, что вы форматируете свои URL в urlencode.
Есть ли шанс получить живой URL, чтобы помочь лучше в этом вопросе?