使用mod_rewrite级联资源选择

时间:2009-11-02 06:13:32

标签: php apache mod-rewrite

我正在研究设置一个有核心和项目命名空间的应用程序,其中核心是项目自定义的默认回退。为了达到目的,我喜欢能够级联各种资源,如css,javascript等,我将其简化为

./.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,所以不觉得有必要在这里讨论基础知识。实现这一目标的最有效(理智)方式是什么?速度问题放在一边,因为大部分时间都会在第一次打击时发现。

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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]

在我的个人测试中,我注意到-f检查仅对完整路径名是准确的,如果您不在文档根目录中,这会使事情变得棘手。可以通过重写文件,然后在request_uri上执行-f来解决这个问题吗?

答案 2 :(得分: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]

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