1

我需要 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 文件并回显它css/g/的脚本(在 Cake MVC 堆栈内)的别名到目前为止的答案似乎可以很好地进行重定向,但是css/g/file.css由于它确实不存在,所以它没有找到任何一个。

4

2 回答 2

3

这是改编自这个 SO questionApache mod_rewrite docs的重写规则。

要点是:如果请求是以 开头的路径/css/,则获取所请求文件的文件系统路径并检查它是否存在。如果 id 没有,请重写更深层目录的 URL。这应该放在您在问题中发布的规则之前。

RewriteCond %{REQUEST_URI} ^/css/
RewriteCond %{REQUEST_FILENAME} !-f   
RewriteRule ^/css/(.*) /css/g/$1
于 2012-07-13T07:17:25.987 回答
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反向引用前一个匹配的文件名(无 .css 扩展名)RewriteCond


编辑:

如果实际生成了文件 css 文件,则跳过 /g/ 版本的检查,直接将其传递给控制器​​:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/css/(.*)\.css$
RewriteRule ^css/(.*)$ index.php/css/g/$1 [L]
于 2012-07-13T07:09:18.350 回答