我试图找到一个解决方案但是没有找到适合我需要的例子。
我在这种类型的路径中有一些图像:/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.所以,它不仅仅是单个文件类型的故障转移,而是更具动态性的。
任何人都可以对我如何解决这个问题有所了解吗?
答案 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]