【问题标题】:Apache rewrite if file doesn't exist, check another directory如果文件不存在,Apache 重写,检查另一个目录
【发布时间】:2011-08-06 21:43:54
【问题描述】:

我试图找到解决方案,但没有找到适合我需要的示例。

我在这种类型的路径中有一些图像:/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。所以,这不仅仅是单一文件类型的故障转移,而是更具动态性。

任何人都可以解释一下我该如何解决这个问题吗?

【问题讨论】:

  • /container/ 文件夹中还有哪些其他文件/文件夹?假设如果找不到/container/any/path/something,那么我是否正确,然后尝试/container/newdir/any/path/something?我的观点——它必须是/year/month/ 格式,或者我可以忽略格式并尝试在/newdir/ 中搜索任何请求(如果在第一个位置找不到)?
  • 我猜它可以搜索整个目录。基本上,/container/ 中的内容路径与/container/newdir/ 中的内容路径相同。因此,您建议在 /newdir/ 中搜索不在第一个位置的任何请求正是我想要的。

标签: apache mod-rewrite


【解决方案1】:
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 次。

【讨论】:

  • Forern,谢谢。我将如何更动态地处理路径?我的意思是,我如何处理 2011 年可能是 2010 年、2009 年或大多数其他年份的事实?与08相同,可以是任何月份。感谢您查看此内容!
  • 谢谢 Foren,我会试一试!
【解决方案2】:

这是一个更通用的响应,但希望对解决方案有所帮助。在我们的 CMS 中,我们有一个 /images 文件夹,CSS 将始终引用该目录,但我希望能够在本地将图像组织到子目录中,但仍解析为 CSS 中引用的根 /images 文件夹。

在下面的示例中,我捕获文件名并将其存储到环境变量 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]

【讨论】:

    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    相关资源
    最近更新 更多