.htaccess RewriteCond用于另一个文件夹中的图像

时间:2014-10-07 02:52:35

标签: apache .htaccess

是的,还有另一个RewriteCond,但是我想把头发拉出来试图让它发挥作用......

我将Apache root作为/var/www/html/,如果我转到http://example.com/,它会正确使用/var/www/html/index.php

现在,问题是我有/var/www/images/example.com/中的图像。这是因为我有一个需要动态的多站点设置。 PHP将解析使用哪个站点的代码,因此移动图像或别名它们不是一个选项,因为它需要是动态的。

所以,我的/var/www/html/.htaccess

中有类似的内容
Options -MultiViews -Indexes

RewriteEngine on

RewriteCond /var/www/images/example.com%{REQUEST_URI} -f
RewriteRule ^(.+)$ /var/www/images/example.com/$1 # <--- this DOES fire when the image exists

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /var/www/html/test.php?file=%{REQUEST_FILENAME} [END]

test.php只是回声$_GET,奇怪的是$_GET['file']/var/www/html/var

我做错了什么?!


更新

好的,现在我有了这个:

RewriteCond %{REQUEST_URI} !^/sites/
RewriteRule ^(.*)$ sites/%{HTTP_HOST}/$1 [NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php

我更改了它,以便站点文件位于主服务器根目录中。现在我无法让它不允许直接访问文件。

我想要的是:

http://example.com/images/fb.png - &gt; /var/www/sites/example.com/images/fb.png http://example.com/sites/example.com/images/fb.png - &gt; /var/www/index.php(显示404) http://example.com/whatever - &gt; /var/www/index.php

如您所见,第二行文件是文件的完全直接路径,应该传递给index.php ,而只是发送文件。如何防止这种情况?

2 个答案:

答案 0 :(得分:1)

您无法重写文档根目录中的某些内容(出于明显的安全原因,否则人们只会注入要重写为/etc/passwd的内容)。这意味着你无法对/var/www/html/中没有的任何事情做任何事情。您需要做的是使用可以访问文档根目录之外的文件的脚本。也许是这样的:

RewriteCond /var/www/images/example.com%{REQUEST_URI} -f
RewriteRule ^(.+)$ /image_serve.php?img=example.com/$1 [L]

然后,image_serve.php脚本会执行以下操作:

 <?php
  if (substr($_GET['img'], -strlen('.png')) === '.png')
    header("Content-Type: image/png");
  else if (substr($_GET['img'], -strlen('.gif')) === '.gif')
    header("Content-Type: image/gif");
  else if (substr($_GET['img'], -strlen('.jpg')) === '.jpg')
    header("Content-Type: image/jpeg");

  readfile('/var/www/images/' . $_GET['img']);
?> 

答案 1 :(得分:0)

这就是我想要的。

# rewrite to site subfolder
RewriteRule ^(.*)$ sites/%{HTTP_HOST}/$1 [NC,QSD,DPI]

# if file doesn't exists in subfolder, just pass it to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [END]

# prevent another go-around
RewriteRule .* - [END]