我需要Apache中的规则,根据其在另一个文件夹中的名称将未找到的CSS文件重定向到另一个位置。像这样:
localhost/css/nonexistent.css
localhost/css/g/nonexistent.css
如果CSS存在,只需按正常方式提供:
localhost/css/existent.css
localhost/css/existent.css
我的项目在CakePHP上,默认情况下附带以下规则:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,L]
我提到它是因为无论新规则是什么,它都不应该破坏Cake的规则。
感谢您的帮助。
编辑:忘记提及css/g/
文件是脚本的别名(在Cake MVC堆栈内), g 使新css文件更加通用并回应它。到目前为止,答案似乎很好地重定向,但它找不到css/g/file.css
,因为它确实不存在。
答案 0 :(得分:3)
以下是改编自this SO question和the Apache mod_rewrite docs的重写规则。
要点是:如果请求是针对以/css/
开头的路径,请获取所请求文件的文件系统路径并检查它是否存在。如果id没有,请重写更深层目录的URL。这应该放在之前你在问题中发布的规则。
RewriteCond %{REQUEST_URI} ^/css/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/css/(.*) /css/g/$1
答案 1 :(得分:2)
您可以先尝试检查/ css / g / css文件是否存在:
# Make sure it doesn't exist
RewriteCond %{REQUEST_FILENAME} !-f
# Make sure this is a request for a css file:
RewriteCond %{REQUEST_URI} ^/css/(.*)\.css$
# See if the /g/ version exists
RewriteCond %{DOCUMENT_ROOT}/css/g/%1.css -f
# rewrite if all conditions satisfied
RewriteRule ^css/(.*)$ /css/g/$1 [L]
第三个条件中的%1 会反向引用上一个RewriteCond
中匹配的文件名(sans .css扩展名)。
编辑:
如果实际生成了文件css文件,则跳过检查/ g / version并将其传递给控制器:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/css/(.*)\.css$
RewriteRule ^css/(.*)$ index.php/css/g/$1 [L]