2009-11-02 95 views
0

我正在研究设置一个应用程序,其中有一个核心和一个项目命名空间,其中核心是项目自定义的默认回退。为此ID希望能够级联各种资源,如CSS,Javascript代码等的练习吧的目的,我已经简化了这个作为使用mod_rewrite级联资源选择

./.htaccess 
./first/firstonly.txt 
./first/both.txt 
./second/secondonly.txt 
./second/both.txt 

预期的行为将是一个请求将在第一寻找之前检查是否存在在第二和最后投掷404

为baseURL时/ firstonly.txt会打./first/firstonly.txt(200),
而baseURL时/ secondonly.txt会尝试./first/secondonly.txt(404 )然后./second/secondonly.txt(200)。
baseurl/both.txt会打到./first/both.txt(200)并且不再继续。
baseurl/nonexistant.txt(404)将贯穿级联并返回404.

我相当mod_rewrite competant,所以不觉得有必要在这里谈论基础知识。什么是最有效的(理智的)实现方式?抛开速度的担忧,因为大部分时间都会在第一次击中时发现。

回答

0
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f 
RewriteRule ^Public/(.*)$ Application/Public/$1 [L] 

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule .* - [L] 

RewriteRule ^(css|scripts|images|assets|flash)/(.*)$ Public/$1/$2 [L] 

这是最终的工作解决方案(上面的沙箱示例以外)。

0

尝试下列规则:

RewriteEngine on 
RewriteRule ^(first|second)/ - [L] 
RewriteCond %{DOCUMENT_ROOT}/first/$0 -f 
RewriteRule ^[^/]+$ first/$0 [L] 
RewriteCond %{DOCUMENT_ROOT}/second/$0 -f 
RewriteRule ^[^/]+$ second/$0 [L] 
+0

啊,是的,这很类似于我自己提出的解决方案,但是它依赖于项目根目录在文档根目录中,这并不总是会发生。它需要能够相对于.htaccess愉快地工作(这是当前的难点) – jhogendorn

+0

@devians:改为尝试使用'RewriteCond first/$ 0 -F'。 – Gumbo

+0

做rewritecond这样的检查似乎不工作,它需要完整的路径 – jhogendorn

0

其他一些可能的解决方案

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^first 
RewriteCond %{REQUEST_URI} !^second 
RewriteRule ^([^/]+\.?[^/])*$ first/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^second 
RewriteRule ^first/([^/]+\.?[^/])*$ second/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^(first|second).*$ 
RewriteRule .* /404.html [L] 

RewriteCond %{REQUEST_URI} 404.html 
RewriteRule .* - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^first 
RewriteCond %{REQUEST_URI} !^second 
RewriteRule ^([^/]+\.?[^/])*$ first/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^second 
RewriteRule ^first/([^/]+\.?[^/])*$ second/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^(first|second).*$ 
RewriteRule .* /404.html [L] 

在我个人的测试IM注意到了-f检查只精确反对完整的路径名,如果你不在文档根目录下,这会让事情变得棘手。这可以通过重写到文件,然后在request_uri上执行-f来解决吗?