我面临的问题与CakePHP有关,我将在该上下文中解释它,但它确实是一个mod_rewrite问题:
在CakePHP中,所有请求都被路由到/app/webroot
目录。在该目录中,我有另一个名为assets
的目录,其中存储了所有用户上传的文件。我现在希望能够为该文件夹中的每个图像提供缩略图,我想在第一次请求时自动生成然后缓存它们。
为此,我在.htaccess
目录中有一个assets
文件,该文件应该将所有以thumbs/
开头的请求路由到PHPThumb脚本。现在我可以简单地将所述脚本放入assets
目录中,一切都会正常工作。但是:
/app/tmp
目录中,我尝试过的(在/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
中的那个之后,有没有办法绕过/禁用任何其他重写规则?
答案 0 :(得分:2)
问题中的代码有两个大问题:
生产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的情况下提供这些资产更慢。
如果可能,请确保处理拇指图像请求并将其写入与请求相同的网址(或其他位置,并对.htaccess文件进行适当编辑 - here's an example)以便下次请求相同的图像时 - 它直接通过apache提供。如果以任何形式实现缓存技术,其中php是缓存图像请求的一部分 - 缓存不会特别有效。