【问题标题】:Bypass other .htaccess files after RewriteRule在 RewriteRule 之后绕过其他 .htaccess 文件
【发布时间】:2013-08-26 16:22:03
【问题描述】:

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

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

为此,我在assets 目录中有一个.htaccess 文件,它应该将所有以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]

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

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

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

【问题讨论】:

    标签: php .htaccess cakephp mod-rewrite


    【解决方案1】:

    问题

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

    1. 将 mod 重写与任何 FrontController 样式的 php 代码混合使用
    2. 试图路由到一个 假定 无法访问的 php 文件

    对于生产型 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)发送调整大小后的文件内容。

    在网络可访问的路径中缓存

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

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

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

    【讨论】:

    • 是的,我的下一步是首先路由到tmp 目录以检查文件是否已经存在。 Soo.. 点赞webroot
    • 好的,我现在已经按照您建议的方式实现了它,一切都很好!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多