修复通过PHP提供图像时的.htaccess

修复通过PHP提供图像时的.htaccess,php,apache,.htaccess,readfile,php-gd,Php,Apache,.htaccess,Readfile,Php Gd,因此,我试图重定向来自服务器的所有图像请求,以使用自定义PHP脚本。PHP脚本构建在一个框架中,可以通过用户访问该框架,用户显然不知道正在向他们提供图像。所以现在的问题是,这种方法目前适用于it的顶层,但对于后端,它会导致很多问题。例如,如果我尝试在此图像上使用另一个PHP函数,如getimagesize(),则返回的错误是无法打开流 进一步研究这个问题,我注意到这些图像的所有标题都会生成404 not found错误。(通过在线使用头检测工具发现了这一点,然后在错误日志中看到加载的每个图像都出

因此,我试图重定向来自服务器的所有图像请求,以使用自定义PHP脚本。PHP脚本构建在一个框架中,可以通过用户访问该框架,用户显然不知道正在向他们提供图像。所以现在的问题是,这种方法目前适用于it的顶层,但对于后端,它会导致很多问题。例如,如果我尝试在此图像上使用另一个PHP函数,如getimagesize(),则返回的错误是无法打开流

进一步研究这个问题,我注意到这些图像的所有标题都会生成404 not found错误。(通过在线使用头检测工具发现了这一点,然后在错误日志中看到加载的每个图像都出现了404未找到错误)不用说,我不能有这个,我需要所有请求都是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
#启用URL重写
重新启动发动机
#安装目录
重写基/
#保护隐藏文件不被查看
命令拒绝,允许
全盘否定
重写cond%{HTTP_HOST}^i.tinyuploadz.com
重写规则(.*)http://www.tinyuploadz.com/images%{REQUEST_URI}[NC,L,NS]
#保护应用程序和系统文件不被查看
重写规则^(?:应用程序|模块|系统)\b.*index.php/$0[L]
#允许直接显示现有的任何文件或目录
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
#图像预测?
#重写规则/images/(.+)\.jpg/images/$1.jpg[PT]
#将所有其他URL重写为index.php/URL
重写规则。*index.php/$0[PT]
#修复CSS和JS
#重写规则^(.*)\.[\d]{10}\.(css | js)$$1.$2[L]
#不要让人们浏览我们的目录
选项-索引
下面是我当前设置PHP函数的方式(这是由控制器生成的视图)

$day=date(“d”,$image['upload\u time']);
$month=日期(“m”,$image['upload_time']);
$year=日期(“Y”,$image['upload_time']);
$url=IMAGE\u url$年$月份$一天$图像['image_id'].'$图像[‘扩展’];
标题('Content-type:'.$image['mime']);
开关($image['extension']))
{
案例“png”:
$img=@imagecreatefrompng($url);
图像PNG($img);
图像处理(img);
打破
案件‘jpg’:
案例“jpeg”:
$img=@imagecreatefromjpeg($url);
图像jpeg($img);
图像处理(img);
打破
案例“gif”:
if(is_ani($url))
{
readfile($url);
打破
}
$img=@imagecreatefromformgif($url);
图像gif(img);
图像处理(img);
打破
案例“bmp”:
//似乎我们不能为BMP做任何特殊的事情
readfile($url);
打破
违约:
readfile($url);
打破
}
//readfile($url.$image['image_id']..$image['extension']);
//我们不希望科哈纳因为头球的改变而破坏其他任何东西
退出();
函数为_ani($filename)
{
如果(!($fh=@fopen($filename,'rb'))
返回false;
$count=0;
//动画gif包含多个“帧”,每个帧都有一个
//标题由以下部分组成:
//*静态4字节序列(\x00\x21\xF9\x04)
//*4个可变字节
//*静态2字节序列(\x00\x2C)(某些变体可能使用\x00\x21?)
//我们通读文件,直到到达文件末尾,或者找到
//至少2个帧头
而(!feof($fh)和&$count<2)
{
$chunk=fread($fh,1024*100);//一次读取100kb
$count+=preg#u match#u all('#\x00\x21\xF9\x04.{4}\x00(\x2C|\x21)#s',$chunk,$matches);
}
fclose($fh);
返回$count>1;
}
感谢您对此事的帮助:)

尝试更改此选项:

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

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

我怀疑的是,Apache解析重写规则,然后只在
重写规则。*index.php/$0[PT]
行上过滤它,因此它最终会将所有内容传递给index.php。

HTTP请求应该无关紧要……因为当getimagesize提取图像时,它与另一个浏览器相同。确保您正在将URL格式化为urlencode

有没有可能获得一个实时url来更好地解决这个问题

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