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を参照してください)。つまり、複数のRewriteCondで一致にアクセスすることはできません。

環境変数の魔法を使えば、複数のステートメントでやりたいことができるかもしれませんが、ファイル名が安全に見えることを考えると、あなたの場合は、両方のURIにアクセスできる変数THE_REQUESTを使用できると思います。クエリ文字列は次のようになります。

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 に答える