我已经尝试过使用与您类似的设置,即子文件夹中的 CakePHP 2.3,并且使用此设置我也收到 400 错误(包括 FirePHP 中的错误消息!)。
在挖掘了源代码后,我发现了两个罪魁祸首,一个是Asset::getAssetFile()
in Minify/Utility/Routing/Asset.php
,其中为资产生成了正确的 webroot 路径,并且资产 URL 被“转换”为资产文件路径。这些值在 minifiers 配置文件 ( Minify/Vendor/minify/config.php
) 中用于覆盖在f
URL 变量中传递的值并覆盖$_SERVER['DOCUMENT_ROOT']
变量,然后 minifiers 使用该变量来定位资产文件。这里的问题是,对于主题和插件资产,它将路径文件夹分隔符从 转换/
为DS
,这将导致\
在 Windows 系统上使用,导致缩小器失败,因为它不允许反斜杠。要解决此问题,implode(DS, $parts)
请交换implode('/', $parts)
.
https://gist.github.com/ndm2/6192506
此方法的另一个问题是它只能处理来自一个位置的资源,即普通资源、插件资源或主题资源。但是,这可能更多是功能限制而不是错误。
另一个罪魁祸首是 Minify 助手。当 CakePHP 位于子文件夹路径中并通过子文件夹路径访问时,该子文件夹路径将添加到由在 Minify 帮助器中使用的 HTML 帮助器生成的资产 URL 之前。这样做的问题是,在压缩器中,$_SERVER['DOCUMENT_ROOT']
路径将直接与资产文件路径连接(两者都是由Asset::getAssetFile()
前面提到的),导致文件路径像/cakephp/app/webroot/cakephp/css/style.css
,其中/cakephp/app/webroot/
是 webroot 文件路径,并且cakephp/css/style.css
是资产文件路径 (实际上它仍然是一个 URL 片段),当然这些文件不存在。一个快速且可能是肮脏的解决方法是交换
array_push($files, substr($this->assetUrl($asset, $options), 1));
为了
array_push($files, mb_substr($this->assetUrl($asset, $options), mb_strlen($this->request->webroot)));
在MinifyHelper::_path()
位于的方法中Minify/View/Helper/MinifyHelper.php
。这将从路径中剥离子文件夹部分,从而生成正确的文件路径
https://gist.github.com/ndm2/6192504
请记住,这两种可能的修复都需要进行一些测试以确保没有副作用!
现在,如果您不使用 Windows 系统和/或不使用主题和/或插件资产,那么您可以放弃第一个修复,并转到子文件夹问题。如前所述,可能的修复需要进一步测试,因此如果您不确定,那么另一个解决方案是将您的 CakePHP 安装从/cakephp/
子文件夹移到文档根目录(或将文档根目录更改为 CakePHP 安装所在的子文件夹如果适用)。
现在写得很长,我希望我发现的实际上与您遇到的问题相同。附带说明一下,无论如何,向插件开发人员报告这些问题可能是值得的。