htaccess重写if / else场景?

时间:2016-02-04 12:33:59

标签: apache .htaccess mod-rewrite

很快:我希望htaccess决定重写哪两个css文件,具体取决于哪一个。

详细说明:我想以vendor / project / style.css格式包含我的css(后来的js,字体等)

<link rel="stylesheet" type="text/css" href="/vendor/project/style.css">

假设每个项目都可以通过composer安装,因此它位于vendor文件夹中。所以重写很容易:

RewriteRule ^([a-zA-Z0-9_]*)/([a-zA-Z0-9_]*)/(.*)\.css$ vendor/$1/$2/$3.css [L]

但是:您也可以直接克隆每个项目作为根项目,因此它不会落在vendor文件夹中。然后重写应该如下:

RewriteRule ^([a-zA-Z0-9_]*)/([a-zA-Z0-9_]*)/(.*)\.css$ $3.css [L]

我现在的问题是:我怎么告诉apache检查哪个文件确实存在?我试过像:

RewriteCond %{REQUEST_FILENAME} ^([a-zA-Z0-9_]*)/([a-zA-Z0-9_]*)/(.*)\.css$     
RewriteCond %{DOCUMENT_ROOT}/vendor/%1/%2/%3\.css -f
RewriteRule ^([a-zA-Z0-9_]*)/([a-zA-Z0-9_]*)/(.*)\.css$ vendor/$1/$2/$3.css [L]

RewriteCond %{REQUEST_FILENAME} ^([a-zA-Z0-9_]*)/([a-zA-Z0-9_]*)/(.*)\.css$     
RewriteCond %{DOCUMENT_ROOT}/%3\.css -f
RewriteRule ^([a-zA-Z0-9_]*)/([a-zA-Z0-9_]*)/(.*)\.css$ $3.css [L]

但完全没有成功。

1 个答案:

答案 0 :(得分:0)

请尝试以下方法:

RewriteEngine On

# Check to see if file exists in `vendor`
RewriteCond %{REQUEST_URI} ^/(\w+)/(\w+)/(.+)\.css$
RewriteCond %{DOCUMENT_ROOT}/vendor/%1/%2/%3.css -f
RewriteRule ^ vendor/%1/%2/%3.css [L]

# Check to see if file exists in directory root
RewriteCond %{REQUEST_URI} ^/(\w+)/(\w+)/(.+)\.css$
RewriteCond %{DOCUMENT_ROOT}/%3.css -f
RewriteRule ^ %3.css [L]

您可以查看REQUEST_URI,无需再次检查规则(请注意重写目标中的%)。此外,已将匹配组更改为使用\w+ - 这是您之前所拥有的简写,但*已替换为+,因为前者会检查为空字符串也是。

这已在我的本地服务器上进行了测试,并按预期工作。