config->enableStatic) { die('Minify static serving is not enabled. Set $min_enableStatic = true; in config.php'); } require __DIR__ . '/lib.php'; if (!is_writable(__DIR__)) { http_response_code(500); die('Directory is not writable.'); } // parse request // SCRIPT_NAME = /path/to/minify/static/gen.php // REQUEST_URI = /path/to/minify/static/1467084520/b=path/to/minify&f=quick-test.js // "/path/to/minify/static" $root_uri = dirname($_SERVER['SCRIPT_NAME']); // "/1467084520/b=path/to/minify&f=quick-test.js" $uri = substr($_SERVER['REQUEST_URI'], strlen($root_uri)); if (!preg_match('~^/(\d+)/(.*)$~', $uri, $m)) { http_response_code(404); die('File not found'); } // "1467084520" $requested_cache_dir = $m[1]; // "b=path/to/minify&f=quick-test.js" $query = $m[2]; // we basically want canonical querystrings because we make a file for each one. // manual parsing is the only way to do this. The MinApp controller will validate // these parameters anyway. $get_params = array(); foreach (explode('&', $query) as $piece) { if (strpos($piece, '=') === false) { $send_400(); } list($key, $value) = explode('=', $piece, 2); if (!in_array($key, array('f', 'g', 'b', 'z'))) { $send_400(); } if (isset($get_params[$key])) { // already used $send_400(); } if ($key === 'z' && !preg_match('~^\.(css|js)$~', $value, $m)) { $send_400(); } $get_params[$key] = urldecode($value); } $cache_time = Minify\StaticService\get_cache_time(); if (!$cache_time) { http_response_code(500); die('Directory is not writable.'); } $app->env = new Minify_Env(array( 'get' => $get_params, )); $ctrl = $app->controller; $options = $app->serveOptions; $sources = $ctrl->createConfiguration($options)->getSources(); if (!$sources) { http_response_code(404); die('File not found'); } if ($sources[0]->getId() === 'id::missingFile') { $send_400('Bad URL: missing file'); } // we need URL to end in appropriate extension $type = $sources[0]->getContentType(); $ext = ($type === Minify::TYPE_JS) ? '.js' : '.css'; if (substr($query, -strlen($ext)) !== $ext) { $send_301("${root_uri}/${cache_time}/{$query}&z=${ext}"); } // fix the cache dir in the URL if ($cache_time !== $requested_cache_dir) { $send_301("${root_uri}/${cache_time}/${query}"); } $content = $app->minify->combine($sources); // save and send file $file = __DIR__ . "/${cache_time}/${query}"; if (!is_dir(dirname($file))) { mkdir(dirname($file), 0777, true); } file_put_contents($file, $content); header("Content-Type: ${type};charset=utf-8"); header('Cache-Control: max-age=31536000'); echo $content;