2012-08-05 11 views
5

Ich versuche derzeit, mein Javascript zu bündeln, damit ich eine höhere Punktzahl in der Seitengeschwindigkeit/yslow erhalten kann. Aber ich stoße mit diesem Ansatz auf Mauern. Ich benutze derzeit diese als Anleitung, um die js-Dateien zu bündeln. Ich rufe die js-Dateien, aber im Firefox-Tool zeigt, dass die Datei bundle.js nicht existiert, die wahr ist, aber mit dem htaccess change ich die Datei von bundle.php bis bundle.js. Aber ich bekomme keine Ergebnisse. Kann mir jemand helfen, das Problem zu lokalisieren, oder gibt es einen besseren Ansatz, um js-Dateien zu bündeln?Bundle Javascript mit htaccess und PHP

HIER ist meine EXAMPLE. Wenn Sie richtig mit den js-Dateien arbeiten, sollte es 4 Eingabefelder für Datei-Uploads zeigen.

Dies ist, wie ich die js Dateien

<script src='core/bundle.js?js=js/jquery-ui-1.8rc2.custom.min.js,js/globalFunctions.js,js/uploaderPreviewer.js,js/itemForm.js&amp;m=4948599067'> 
</script> 

.htacces nenne * Dateityp ändern

RewriteEngine on 
RewriteRule ^bundle.js$ bundle.php [QSA,L] 

Kern/bundle.php

include "JSMin.php"; 
$path = "../../"; 
$files = explode(",", $_GET['js']); 
$missing = array(); 

$cache = ''; 
foreach ($files as $index => $file) { 
    if (strtolower(substr($file, -2)) != 'js') { 
     unset($files[$index]); 
    } else if (file_exists($path.$file)) { 
     $cache .= $file; 
     $cache .= filemtime($path.$file); 
    } else { 
     $missing[] = $file; 
     unset($files[$index]); 
    } 
} 

$cache = 'cache/'.md5($cache); 

if (count($missing)) { 
    header("Content-type: text/javascript"); 
    header("Pragma: no-cache"); 
    header("Cache-Control: no-cache"); 
    echo "alert('Could not load the following javascript source files:\\n\\n- ".implode("\\n- ", $missing)."\\n\\nJavascript not loaded/running!');"; 
    exit; 
} 

if (count($files)) { 
    // create cached version if not present 
    if (!file_exists($cache)) { 
     $js = ''; 
     foreach ($files as $file) { 
      $js .= JSMin::minify(file_get_contents($path.$file)); 
     } 

     file_put_contents($cache, $js); 
    } 

    // calculate last-modified & etag send caching headers 
    $last_modified_time = filemtime($cache); 
    $etag = md5_file($cache); 

    header("Content-type: text/javascript"); 
    header("Pragma: public"); 
    header("Cache-Control: public"); 
    header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT"); 
    header("Etag: ".$etag); 

    if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time || trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) { 
     header("HTTP/1.1 304 Not Modified"); 
     exit; 
    } 

    readfile($cache); 
} 
+0

Können Sie versuchen, mit core/bundle.php instant von core/bundle.js? Wenn es funktioniert, hat .htaccess wahrscheinlich Probleme. –

+0

Es wäre gut zu erwähnen, dass 'if (strtolower (substr ($ file, -2))! = 'Js') {' ist anfälliger Code. Zum Beispiel: '.htpasswd% 00js' wo'% 00' ein Null-Byte ist, wird Ihre Bedingung bestehen und wird vom Betriebssystem als '.htpasswd' interpretiert. Weitere Informationen finden Sie unter [this] (https://www.owasp.org/index.php/File_System#Path_traversal) und [that] (https://www.owasp.org/index.php/Path_Traversal). – HoLyVieR

+0

Sie können den PHP als js laden, anstatt bundle.js aufzurufen, setzen Sie einfach