代码之家  ›  专栏  ›  技术社区  ›  jhogendorn

使用mod_重写的级联资源选择

  •  0
  • jhogendorn  · 技术社区  · 16 年前

    我正在考虑设置一个应用程序,其中有一个核心和一个项目名称空间,其中核心是项目定制的默认回退。为此,我希望能够级联各种资源,如css、javascript等。为了练习的目的,我将其简化为

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

    对于baseurl/firstonly.txt,将点击/first/firstonly.txt(200),
    而baseurl/secondonly.txt将尝试./first/secondonly.txt(404),然后./second/secondonly.txt(200)。
    baseurl/eather.txt将点击./first/eather.txt(200)并不再继续。
    baseurl/nonexistant.txt(404)将通过级联运行并返回404。

    我对mod_rewrite相当有竞争力,所以不觉得有必要在这里谈论基础知识。最有效(理智)的实施方式是什么?把速度问题放在一边,因为大多数情况下,在第一次击中时都会发现东西。

    3 回复  |  直到 16 年前
        1
  •  0
  •   Gumbo    16 年前

    试试这些规则:

    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]
    
        2
  •  0
  •   jhogendorn    16 年前

    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检查仅对完整路径名是准确的,如果您不在文档根目录中,这会使事情变得棘手。可以通过重写文件,然后对请求uri执行-f来解决这个问题吗?

        3
  •  0
  •   jhogendorn    16 年前
    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]
    

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

    推荐文章