2011-11-21 42 views
0

我想從控制器內發送HTTP/1.0 200 OK內的CakePHPPHP頭200 OK不會發送

,但每次我這樣做,瀏覽器接收HTTP 404,而不是未找到。

https://bugs.php.net/bug.php?id=27026,我要送

HTTP/1.0 299 OK 

任何想法,我缺少的是什麼?

Apache的版本2.2.21

PHP版本5.3.8

CakePHP的2.0

- 編輯 -

我使用的代碼http://rakaz.nl/projects/combine/combine.phps到我的javascript結合和css

ie http://www.creatype.nl/javascript/prototype.js,builder.js,effects.js,dragdrop.js,slider.js

 public function combineJs($filenames) { 
     $this->combine($filenames, 'javascript'); 
    } 

    public function combineCss($filenames) { 
     $this->combine($filenames, 'css'); 
    } 

    private function combine($filenames = null, $type = null) { 
     $cache = true; 
     $cachedir = ROOT.'/app/tmp/cache/combine'; 
     $cssdir = ROOT.'/app/webroot/css'; 
     $jsdir = ROOT.'/app/webroot/js'; 


     // Determine the directory and type we should use 
     switch ($type) { 
      case 'css': 
       $base = $cssdir; 
       break; 
      case 'javascript': 
       $base = $jsdir; 
       break; 
      default: 
       header ("HTTP/1.0 503 Not Implemented"); 
       exit; 
     }; 

     $elements = explode(',', $filenames); 
     $elements = str_replace('%2F', '/', $elements); 
     // Determine last modification date of the files 
     $lastmodified = 0; 
     while (list(,$element) = each($elements)) { 

      $path = $base . '/' . $element; 

      if (($type == 'javascript' && substr($path, -3) != '.js') || 
       ($type == 'css' && substr($path, -4) != '.css')) { 
       header ("HTTP/1.0 403 Forbidden"); 
       exit; 
      } 

      if (substr($path, 0, strlen($base)) != $base || !file_exists($path)) { 

       header ("HTTP/1.0 404 Not Found"); 
       exit; 
      } 

      $lastmodified = max($lastmodified, filemtime($path)); 
     } 

     // Send Etag hash 
     $hash = $lastmodified . '-' . md5($filenames); 
     header ("ETag: \"" . $hash . "\""); 


     if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
      stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"') 
     { 

      // Return visit and no modifications, so do not send anything 
      header ("HTTP/1.0 304 Not Modified"); 
      header ('Content-Length: 0'); 
     } 
     else 
     { 
      // First time visit or files were modified 
      if ($cache) 
      { 
       // Determine supported compression method 
       $gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip'); 
       $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate'); 

       // Determine used compression method 
       $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none'); 

       // Check for buggy versions of Internet Explorer 
       if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') && 
        preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)) { 
        $version = floatval($matches[1]); 

        if ($version < 6) 
         $encoding = 'none'; 

        if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1')) 
         $encoding = 'none'; 
       } 

       // Try the cache first to see if the combined files were already generated 
       $cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : ''); 

       if (file_exists($cachedir . '/' . $cachefile)) { 

        if ($fp = fopen($cachedir . '/' . $cachefile, 'rb')) { 

         if ($encoding != 'none') { 
          header ("Content-Encoding: " . $encoding); 
         } 

         header ("HTTP/1.0 304 Not Modified"); 
         header ("Content-Type: text/" . $type); 
         header ("Content-Length: " . filesize($cachedir . '/' . $cachefile)); 

         fpassthru($fp); 
         fclose($fp); 

         exit; 
        } 
       } 
      } 

      // Get contents of the files 
      $contents = ''; 
      reset($elements); 
      while (list(,$element) = each($elements)) { 
       $path = $base . '/' . $element; 
       $contents .= "\n\n" . file_get_contents($path); 
      } 

      // Send Content-Type 
      // header ("HTTP/1.0 200 OK"); 

      // for some reason, header 200 OK doesn't get sent, so send 299 instead 
      header ("HTTP/1.0 299 OK"); 
      header ("Content-Type: text/" . $type); 

      if (isset($encoding) && $encoding != 'none') 
      { 
       // Send compressed contents 
       $contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE); 
       header ("Content-Encoding: " . $encoding); 
       header ('Content-Length: ' . strlen($contents)); 

       echo $contents; 
      } 
      else 
      { 
       // Send regular contents 
       header ('Content-Length: ' . strlen($contents)); 
       header ("Content-Type: text/" . $type); 
       echo $contents; 
      } 

      // Store cache 
      if ($cache) { 

       $filepath = $cachedir . '/' . $cachefile; 
       $file = new File($filepath); 
       $file->write($contents); 
       $file->close(); 
      } 

      exit; 
     } 
+1

一些代碼會有所幫助。 – mkriheli

+2

除了該錯誤在2004年被標記爲固定。如果您收到404錯誤,請檢查您的日誌並確保您確實正在擊中您嘗試擊中的腳本。 – Crontab

+0

您不必手動發送200。 CakePHP在正常操作中自動執行該操作。有些細節會有幫助,否則這個問題沒有多大意義。 – JJJ

回答

0

我需要爲此創建健康狀態報告以實現AWS負載平衡。

將傳入支票指向正確加載的網頁對我來說有什麼竅門。

我將狀態檢查器指向www.yourdomain.com並返回了正確的信號。

嘗試在調試設置爲2的瀏覽器中加載頁面。如果cake返回錯誤,則不會發送正確的信號。爲您的控制器創建一個視圖文件,以避免錯誤發生,並且您可能會開始生成正確的信號。

0

CakePHP路由器存在一個問題,我希望它能夠正常工作。它不喜歡url中的%char,並且如果它在URL中看到%,就會拋出404條件。

1

我遇到了同樣的問題,幾乎通過我的顯示器扔了一杯。您可能需要爲標題調用使用替代語法:

header('Status: 200'); 

這似乎是PHP與服務器交互方式的問題。