【问题标题】:Cakephp -Minify 400 Bad requestCakephp -Minify 400 Bad request
【发布时间】:2013-08-08 09:28:12
【问题描述】:

我正在开发一个 Cakephp 2.3.. 我使用这个插件与 minify 一起工作

https://github.com/maurymmarques/minify-cakephp

但我似乎无法正常工作 .. 我的网站没有正确加载 css 和 js ..

我将文件夹复制到 app/plugins 目录中,将所有 css 和 js 导入到 layouts 文件夹中的 default.php 文件中 我正在这样做

echo $this->Minify->css(array('reset', 'style','colors'));

在浏览器中 url 变成了这样

<link rel="stylesheet" type="text/css" href="/cakephp/min-css?f=cakephp/css/reset.css,cakephp/css/style.css,cakephp/css/colors.css

当我点击 url 时出现此错误

  400 Bad request 
 Please see http://code.google.com/p/minify/wiki/Debugging.

我在我的 appController 中调用 helper

 class AppController extends Controller {

public $helpers = array('Minify.Minify');

【问题讨论】:

  • HTTP 400 通常是由安全组件引起的,它在blackhole handler 中抛出了一个错误的请求异常。也许您正在使用任何SecurityComponent:require* methods 或其他东西。暂时禁用组件,看看是否是这个问题。
  • @ndm 是的,我正在使用黑洞安全组件.. 但知道我已经删除了代码,但它仍然显示相同的消息
  • 请帮帮我,我真的被困在这里了
  • 我刚刚意识到您添加到错误中的 URL 实际上是错误消息的一部分,因此似乎很清楚它是缩小器本身发出 400 响应。您是否已经尝试过使用该页面上描述的 FirePHP 进行调试?如果有,结果如何?
  • 那么请您这样做并发布结果,我怀疑是资产URL到文件转换的问题,导致路径不存在。

标签: cakephp cakephp-2.0 cakephp-2.1 minify


【解决方案1】:

我已尝试使用与您类似的设置,即子文件夹中的 CakePHP 2.3,并且使用此设置我也收到 400 错误(包括 FirePHP 中的错误消息!)。

在挖掘了源代码后,我发现了两个罪魁祸首,一个是Minify/Utility/Routing/Asset.php 中的Asset::getAssetFile(),其中为资产生成了正确的 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)));

在位于Minify/View/Helper/MinifyHelper.phpMinifyHelper::_path() 方法中。这将从路径中剥离子文件夹部分,从而生成正确的文件路径

https://gist.github.com/ndm2/6192504

请记住,这两种可能的修复都需要进行一些测试以确保没有副作用!

现在,如果您不使用 Windows 系统和/或不使用主题和/或插件资产,那么您可以放弃第一个修复,并转到子文件夹问题。如前所述,可能的修复需要进一步测试,所以如果您不确定,那么另一个解决方案是将您的 CakePHP 安装移出 /cakephp/ 子文件夹到文档根目录(或将文档根目录更改为您 CakePHP 所在的子文件夹如果适用,安装位置)。

现在写得很长,我希望我发现的问题实际上与您遇到的问题相同。顺便说一句,无论如何,向插件开发人员报告这些问题可能是值得的。

【讨论】:

  • 非常感谢您的努力.. 真的非常感谢...所以请告诉我,我实际上是在本地主机上测试此插件...而我的原始网站托管在根目录上的 linux 服务器上。 ..所以如果我像你说的那样直接尝试我在linux和根文件夹上的插件..它可以正常工作吗?或者我是否也必须像你在这个答案中提到的那样做一些改变
  • 理论上它应该可以工作,但你永远不知道。你必须试一试才能找到答案。
  • 非常感谢...是的,它可以在 linux 服务器上运行...谢谢...每当我必须尝试一些新插件时,我首先在 localhost 上进行测试,然后更新网站.. 但是这次........好吧,谢谢你的一切..
  • 如果你不介意最后一件事.....如果你想回答否则没关系我如何添加媒体来缩小链接..我的意思是我如何添加这个 echo $this-> html->css('7683860.css', null, array('media' => 'only all and (min-width: 768px)'));
  • 这将是一个新问题,无论如何,只需以相同的方式将其传递给 Minify 助手,它接受相同的参数并将它们传递给 HTML 助手:$this-&gt;Minify-&gt;css('7683860.css', null, array('media' =&gt; 'only all and (min-width: 768px)'));
猜你喜欢
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2019-09-26
  • 2021-10-28
  • 2021-09-26
相关资源
最近更新 更多