mod_rewrite:如果该文件存在于另一个目录中,请改为使用该文件

Wal*_*han 8 .htaccess mod-rewrite

我有一个网站example.com/test/.让我们说网站的布局如下:

example.com
??? test/
    ??? assets/
    ?   ?? stylesheet.css
    ?
    ??? .htaccess
    ??? index.php
Run Code Online (Sandbox Code Playgroud)

index.php 这是路由器,现在看起来很酷.

每当用户请求类似的页面时example.com/test/stylesheet.css,我想检查是否assets/有该文件,如果有,请提供该文件而不是提供URL index.php.理想情况下,以下方法可行:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond assets/%{REQUEST_FILENAME} -f
RewriteRule ^(.+)$ assets/$1
Run Code Online (Sandbox Code Playgroud)

但既然%{REQUEST_FILENAME}是一条绝对的道路,assets/%{REQUEST_FILENAME}那就像是一样assets/home/public/test/stylesheet.css.%{REQUEST_URI}不是更好:它变成了assets/test/stylesheet.css.我也看了这个问题,但答案也没有用.

有没有办法,没有诉诸PHP,这样做?(如果没有,我只会使用PHP readfile,但我不想担心LFI或其他任何东西.)

Jon*_*Lin 9

尝试使用the %{DOCUMENT_ROOT}%{REQUEST_URI}vars

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/assets/%{REQUEST_URI} -f
RewriteRule ^(.+)$ assets/$1
Run Code Online (Sandbox Code Playgroud)

编辑:我明白了,试试这个:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/([^/]+)/(.+)$
RewriteCond %{DOCUMENT_ROOT}/%1/assets/%2 -f
RewriteRule ^(.*)$ /%1/assets/%2 [L,R]
Run Code Online (Sandbox Code Playgroud)