如果找不到文件,则重定向到控制器操作

时间:2013-09-12 19:48:16

标签: cakephp url-rewriting lighttpd

我正在尝试为lighttpd配置重写规则,以便在找不到文件时执行特定的cakephp控制器操作。 controller-action将生成数据(png文件),保存以供将来使用,然后将其提供给客户端。下次有人试图访问该文件时,它将由lighttpd直接提供,而不执行任何php。换句话说,png文件被缓存,因此不需要重新创建它们。

据我所知,如果rewrite-once匹配,则会忽略url.rewrite-if-not-file。因此,以下内容可以提供我的缓存文件,但不能提供未缓存的文件。

url.rewrite-if-not-file = (
  "^/scan/(.+)\.png" => "/mycontroller/scan/$1"
)

url.rewrite-once = (
  "^/(css|files|img|js)/(.*)" => "/$1/$2",
  "^/favicon.ico" => "/favicon.ico",    
  "^/scan/(.+\.png)" => "/scan/$1",
  "^([^\?]*)(\?(.+))?$" => "/index.php?url=$1&$3",
)

我现在能想到的唯一解决方案是删除第3条规则并修改^([^\?]*)(\?(.+))?$,以便它忽略以\scan\开头的网址。

还有其他建议吗?

1 个答案:

答案 0 :(得分:0)

我会在控制器中做这样的事情:

if (file_exists($file_name)) {
    $this->redirect($file_name);
} else {
    $this->redirect(array('action' => 'some_action', 'controller' => 'some_controller'));
}