PHP5 + FastCGI + Apache2 發生 header 錯誤的問題..

Apache2 用 FastCGI 跑 PHP5 之後,在 ERROR LOG 發生這個問題

FastCGI: comm with server “/my_path/my_cgi.fcgi” aborted: error parsing headers: duplicate header ‘Status’


解法是,把原本程式裡面 PHP5 會送出 header 的地方改掉,把 HTTP/1.1 換成 Status: ,例如:

原本的 apache2-mpm-prefork + mod_php5 跑得很好,但換成 apache2-worker + FastCGI + php-cgi 後卻會導致 Internel Error ,不過只要改成下面這種作法就正常了:

這是因為 php-cgi 是回應給 FastCGI 然後 FastCGI 再給 Apache2 ,但 FastCGI 看不懂 HTTP/1.1 (只看得懂 Status Code),所以會有錯誤 。另外在 FastCGI 模式下 Header 有個特性,除非 header(“Location: url”) 其中 url 的內容是 HTTP 開頭的完整路徑,要不然 FastCGI 會把它當成內部路徑(就是磁碟上的路徑),詳細說明可以看 Module mod_fastcgi 裡面的 “Notes on CGI response headers” 。

不過在 Lighttpd 裡面,看似沒有這個問題,因為在它們的部落格有篇 Faster FastCGI 提到:「We are just forwarding them in most cases without touching them.」.. XD

另外, FastCGI 也會導致沒辦法進行 401 Authorization ,所以要在 Apache2 的 FastCGI 設定多加上

唉,有時候,換種方式來跑,背後也是要修修改改不少地方…

UPDATE.20100907: FastCGI FAQ

Posted in computers

Leave a Reply

Your email address will not be published.