2013-02-10 2 views
0

/server123/get_file.php?file=frame-38-227113.jpg과 같은 전화를 (내부적으로) /server123/cache/2/2/7/227113/frame-38-227113.jpg으로 리디렉션하려고합니다.존재하는 경우에만 HTTP 요청을 파일로 리디렉션

물론 해당 파일이 실제로 존재하는 경우에만. 그렇지 않으면 파일을 가져 오기 위해 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

나는 규칙에서이 문제를 참조하십시오

  1. 당신의 그룹 및 파일 이름은 당신이 원하는 말과 일치하지 않는 것. 디렉토리 구조를 신중하게 보면, 캡처하지 않는 파일의 전체 6 자리 ID를 포함하는 디렉토리가있는 것 같습니다.
  2. % N 대체 내용은 에 대한 일치 항목 만 포함합니다. RewriteCond 문 (문서 별, 참조 : http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond); 즉 액세스가 여러 개의 RewriteConds에 일치 할 수 없습니다.

나는 환경 변수 마술을 사용하여 여러 문장에서 원하는 것을 할 수 있다고 생각하지만 파일 이름이 안전하다고 생각하면 귀하의 경우 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 탈출되지는 URI와 같은 한 가지의 쿼리 문자열 모두에 액세스 할 수 있습니다!

관련 문제