1

我面临的问题与 CakePHP 有关,我将在该上下文中解释它,但它确实是一个 mod_rewrite 问题:

在 CakePHP 中,所有请求都被路由到/app/webroot目录中。在该目录中,我有另一个名为assets的目录,其中存储了所有用户上传的文件。我现在希望能够为该文件夹中的每个图像提供缩略图,并且我想在第一个请求时自动生成并缓存它们。

为此,我.htaccess在目录中有一个文件assets,它应该将所有thumbs/以 PHPThumb 脚本开头的请求路由。现在我可以简单地将所述脚本放入assets目录中,一切都会正常工作。但:

  1. 我想避免文件膨胀(因为可以有多个分辨率缩略图等等),因此宁愿将这些缩略图存储在/app/tmp目录中,
  2. 整个事情是我正在开发的 CakePHP 插件的一部分,所以如果脚本可以保留在插件文件夹中,那就太好了。

我尝试过的(在/app/webroot/assets目录内):

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^thumbs\/([^\/]*)\/(.*)$ ../../Plugin/MyPlugin/Lib/thumbnail.php?size=$1&path=$2 [QSA,L,S=2]

现在这行不通了。问题是其中的.htaccess文件/app以及/app/webroot将所有内容路由到/app/webroot/index.php(或任何物理文件webroot)的文件。该S标志似乎仅适用于同一文件中的规则。

我显然可以更改这些文件以允许thumbnail.php,但正如我所说,它是插件的一部分,我希望尽可能保持它的配置少。

所以我的问题是:有没有办法在应用 in 之后绕过/禁用任何其他重写规则/app/webroot/assets/.htaccess

4

1 回答 1

2

问题

问题的代码中有两个大问题:

  1. 将 mod 重写与任何 FrontController 样式的 php 代码混合
  2. 尝试路由到应该无法访问的 php 文件

生产 CakePHP 应用程序唯一可以通过网络访问的 php 文件是webroot/index.php

创建控制器动作

执行您要求的正确方法是创建路由和控制器操作:

路线:

<?php
// app/Config/routes.php
Router::connect(
    '/thumbs/*, 
    array('controller' => 'thumbs', 'action' => 'serve')
);

控制器:

<?php
// app/Controller/ThumbsController.php
class ThumbsController extends AppController {

    function serve() {
        // resize file, 
        //(preferably write to the request uri) 
        //and serve the image
    }
}

控制器动作可以使用发送文件(或旧版本中的媒体视图)在调整大小后发送文件内容。

缓存在 Web 可访问的路径中

请注意,使用 php 提供文件总是很慢

众所周知,通过 PHP 提供资产肯定比不调用 PHP 提供这些资产要慢。

如果可能,请确保处理对缩略图的请求并将其写入与请求相同的 url(或不同的位置,对 .htaccess 文件进行适当的编辑 -这是一个示例),以便下次请求相同的图像 - 它直接通过 apache 提供。如果以任何形式实现缓存技术,其中 php 是对缓存图像的请求的一部分 - 缓存不会特别有效。

于 2013-08-26T16:36:40.953 回答