Apache重写如果文件不存在,请检查另一个目录

时间:2011-08-06 21:43:55

标签: apache mod-rewrite

我试图找到一个解决方案但是没有找到适合我需要的例子。

我在这种类型的路径中有一些图像:/container/2011/08/myfile.ext。我必须将该路径中的一些文件移动到这样的文件:/container/newdir/2011/08/myfile.ext。唯一的变化是一些文件将移动到路径的“newdir”部分,但路径结构的其余部分是相同的。

我正在尝试弄清楚如何创建Apache / htaccess重写,首先检查原始位置/container/2011/08/myfile.ext中的文件,如果找不到,请检入新位置/container/2011/08/myfile.ext如果没有找到,则返回标准404。

我找到了流程和其他重定向的解决方案,但不是整个路径。当然,由于容器中的项目是特定于日期的,因此我需要一些可以获取所请求文件的路径,如果在请求的位置找不到,请检查新位置,如果没有找到,则发送正常的404.所以,它不仅仅是单个文件类型的故障转移,而是更具动态性的。

任何人都可以对我如何解决这个问题有所了解吗?

2 个答案:

答案 0 :(得分:10)

RewriteCond %{REQUEST_URI} ^/container/\d{4}/\d{2}/.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(container)(/\d{4}/\d{2}/.+)$ $1/newdir$2

如果请求/container/2011/08/foo.bar但不存在,则会重写为/container/newdir/2011/08/foo.bar。如果它也不存在,那么它应该会产生404。

\d表示数字,{x}表示重复x次。

答案 1 :(得分:1)

这是一个更通用的答复,但希望能为您提供解决方案。在我们的CMS中,我们只有一个/ images文件夹,CSS始终会引用该目录,但是我希望能够将图像本地组织到子目录中,但仍可以解析为CSS中引用的/ images根目录。 / p>

在下面的示例中,我捕获了文件名并将其存储到环境变量FILENAME中。然后逐步执行重写条件,在执行重写之前检查文件在可用文件夹/ icons和/ sprites中是否存在。

RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} (([a-zA-Z0-9\-\_\ \.]+)\.(gif|jpg|png|jpeg|swf))$
RewriteRule .* - [ENV=FILENAME:%1]

RewriteCond %{DOCUMENT_ROOT}/assets/images/sprites/%{ENV:FILENAME} -f
RewriteRule ([a-zA-Z0-9\-\_\ \.]+)\.(gif|jpg|png|jpeg|swf)$ assets/images/sprites/$1.$2 [L]

RewriteCond %{DOCUMENT_ROOT}/assets/images/icons/%{ENV:FILENAME} -f
RewriteRule ([a-zA-Z0-9\-\_\ \.]+)\.(gif|jpg|png|jpeg|swf)$ assets/images/icons/$1.$2 [L]