是的,还有另一个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 ,而只是发送文件。如何防止这种情况?
答案 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]