2012-06-30 106 views
6

以下是我的目录结构:从一个目录重定向到另一个mod_rewrite的

admin\ 
controls\ 
images\ 
media\ 
lib\ 
models\ 
views\ 
index.php 
.htaccess 

以下是我的.htaccess

RewriteEngine On 
RewriteRule /admin/images/(.*) /images/$1 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php 

我想要的一切,在/管理/图片等于/根目录中的图像。例如:http://www.example.com/admin/images/example.png将同http://www.example.com/images/example.png

问题,我的.htaccess是: 它去到index.php,而不是镜像管理员/图像图像/


解决方案

RewriteEngine On 
RewriteRule /admin/images/(.*) /images/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php 
+0

但是最新的问题是什么? – brezanac

+0

它去index.php而不是镜像管理员/图像到图像/ – invisal

回答

10

您需要指定您的图像重写规则是该行中的最后一个,以防止进一步重写。为此,您只需在图像重写规则的末尾指定[L]即可。

RewriteEngine On 
RewriteRule /admin/images/(.*) /images/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php 

编辑:这是为什么会出现这个问题的解释(从评论部分,以提供澄清拍摄)。

无论执行多少个重写阶段,您都会看到原始的%{REQUEST_FILENAME}永远不会改变。这意味着,当达到第二条规则时,变量实际上仍然指向现有图像(位于/admin/images/),而不是指向正在被重写且不存在的位置(/images/)。这就是为什么总是应用第二条规则的原因,以及为什么示例中的两条条件线几乎总是重写期间要使用的第一条。

+1

我很蠢。我尝试过[L]一次(也许我忘了保存那段时间,但它不工作)。非常感谢。它正在工作。 – invisal

+0

对不起,我也想明白。 RewriteCond认为只有当请求的文件不是文件或目录时才应用最后一条规则......不是图像文件(假设图像存在)? – Zagorax

+0

你是对的,但是这些规则中隐藏着一个小小的技巧,它是造成混淆的原因:)无论执行了多少个重写阶段,你都会看到原始的'%{REQUEST_FILENAME}'将永远不会改变**。这意味着,当达到第二个规则时,变量实际上仍然指向现有图像(在'/ admin/images /'中),而不是指向正在被重写和不存在的图像('/ images /')。这就是为什么总是应用第二条规则的原因,以及为什么示例中的两条条件线几乎总是重写期间要使用的第一条。 – brezanac

4

更改规则如下:

RewriteEngine On 
RewriteRule ^admin/images/(.*) images/$1 

把你的.htaccess放到你的文档根目录下,或者在'/ admin'父文件夹中。

+0

我试过了,它没有工作。我也放入了文档根目录和管理文件夹。无论如何,谢谢你回答我的问题。 +1 – invisal

+0

很奇怪。看看http://www.francescoruvolo.it/test/admin/images/。它在我的服务器上完美工作。我在/ test/admin/images中没有任何index.html,而在测试/图片上有一个index.html。你的httpd.conf允许使用.htaccess吗? – Zagorax

+0

问题是我的其他RewriteRule覆盖了这个RewriteRule。添加[L]只是解决问题。 – invisal

相关问题