在RewriteRule之后绕过其他.htaccess文件

时间:2013-08-26 16:22:03

标签: php .htaccess cakephp mod-rewrite

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

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

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

  1. 我想避免文件膨胀(因为可能存在多个分辨率缩略图等),因此更愿意将这些缩略图存储在/app/tmp目录中,
  2. 整个事情是我正在开发的CakePHP插件的一部分,所以如果脚本可以保留在Plugin的文件夹中,它会很简洁。
  3. 我尝试过的(在/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,但正如我所说,它是插件的一部分,我宁愿尽可能保持配置。

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

1 个答案:

答案 0 :(得分:2)

问题

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

  1. 混合mod重写,以及任何FrontController风格的PHP代码
  2. 尝试路由到假定无法访问的php文件
  3. 生产CakePHP应用程序应该可以通过Web访问的唯一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
        }
    }
    

    控制器操作可以使用send-file(或旧版本中的media views)在调整大小后发送文件内容。

    在Web可访问路径中缓存

    请注意,使用php is always slow提供文件:

      

    众所周知,通过PHP提供资产可以保证比在不调用PHP的情况下提供这些资产更慢。

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