仅将HTTP请求重定向到文件(如果存在)

时间:2013-02-10 13:22:39

标签: .htaccess mod-rewrite apache2

我正在尝试(内部)将/server123/get_file.php?file=frame-38-227113.jpg之类的调用重定向到/server123/cache/2/2/7/227113/frame-38-227113.jpg

当然,只有该文件确实存在。否则,它需要通过get_file脚本才能获取文件。

但是我没能创建正确的重写规则。

到目前为止我所拥有的:

RewriteEngine On

RewriteCond %{REQUEST_URI} =/get_file.php
RewriteRule ^.*$ /server063/get_file.php [L]

RewriteCond %{QUERY_STRING} file=(frame-[0-9]+-([0-9])([0-9])([0-9])[0-9]+.jpg)
RewriteCond %{REQUEST_URI} ^/(server[0-9]+)/get_file.php
RewriteCond %6/cache/%2/%3/%4/%1 -f
RewriteRule ^.*$ /$6/$5/cache/%2/%3/%4/%1 [L]

但这不起作用。

我希望有人可以给我一些见解?

此外,在尝试阻止无限循环时,我尝试使用IS_SUBREQ,但这似乎没有做太多(例如:它总是重新尝试循环)。

1 个答案:

答案 0 :(得分:1)

我在你的规则中看到了2个问题:

  1. 您的群组和文件名似乎与您想要的内容不符。仔细查看目录结构,你似乎有一个dir包含你没有捕获的文件的完整6位数id;
  2. %N替换仅包含 last RewriteCond语句的匹配项(根据文档,请参阅:http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond);这意味着无法访问多个RewriteConds上的匹配项。
  3. 我认为使用一些环境变量魔术,您可能能够在多个语句中执行您想要的操作,但鉴于您的文件名看起来很安全,我认为在您的情况下,您可以使用变量THE_REQUEST,它允许您访问uri和查询字符串都是这样的:

    RewriteCond %{THE_REQUEST} ^GET\ /(server[0-9]+)/get_file\.php\?file=(frame-[0-9]+-(([0-9])([0-9])([0-9])[0-9]+).jpg)
    RewriteCond %{DOCUMENT_ROOT}/%1/cache/%4/%5/%6/%3/%2 -f
    RewriteRule . %1/cache/%4/%5/%6/%3/%2 [L]
    

    注意:THE_REQUEST未被转义!