Исправление .htaccess при обслуживании изображений через PHP - PullRequest
0 голосов
/ 06 марта 2012

Поэтому я пытаюсь перенаправить все запросы изображений с моего сервера, чтобы использовать собственный скрипт 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 ]

0 голосов
/ 07 марта 2012

HTTP-запрос не должен иметь значения ... Потому что когда getimagesize извлекает изображение, оно совпадает с другим браузером.Убедитесь, что вы форматируете свои URL в urlencode.

Есть ли шанс получить реальный URL, чтобы лучше справиться с этой проблемой?

0 голосов
/ 06 марта 2012

Попробуйте изменить это:

#RewriteRule /images/(.+)\.jpg /images/$1.jpg [PT]

На это:

RewriteRule /images/(.+)\.jpg /images/$1.jpg [PT,L]

Я подозреваю, что Apache анализирует правило перезаписи, но затем фильтрует его только на RewriteRule .* index.php/$0 [PT] line, так что в конце концов он действительно передает все в index.php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...