Apache重写条件在css不存在时回退

时间:2012-07-13 05:25:57

标签: apache .htaccess cakephp mod-rewrite

我需要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,因为它确实不存在。

2 个答案:

答案 0 :(得分:3)

以下是改编自this SO questionthe 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]