0

我正在尝试(内部)将呼叫重定向/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,但这似乎没有多大作用(例如:它总是重新尝试循环)。

4

1 回答 1

1

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

  1. 您的组和文件名似乎与您所说的不符。仔细查看目录结构,您似乎有一个包含文件的完整 6 位 id 的目录,您没有捕获该目录;
  2. %N 替换仅包含最后一个RewriteCond 语句的匹配项(根据文档,请参阅: http ://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond );这意味着您不能通过多个 RewriteConds 访问匹配项。

我认为通过一些环境变量魔术,您可以在多个语句中执行您想要的操作,但是鉴于您的文件名看起来很安全,我认为在您的情况下,您可以使用变量 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 没有被转义!

于 2013-02-10T14:41:53.060 回答