12.8 CGI 程式常見疑難

為何我的 CGI 程式執行時,出現 Server Error 500 的錯誤訊息?

見到的畫面如下所示:

The server encountered an internal error or misconfiguration and was 
unable to complete your request. Please contact the server administrator, 
mmm@nnn.com and inform them of the time the error occurred, and anything 
you might have done that may have caused the error.

More information about this error may be available in the server error log.

CGI 程式出現 Server Error 500 的現象很平常,不管是 CGI 程式的新手或老手,都經常會碰到這個情況。 So,不要灰心! :-)

以下是我寫作 CGI 程式幾年來的一些偵錯經驗,提供給各位做參考:

1.CGI 程式中沒有印出: 欲輸出內容的 MIME 型態.

一般而言, 就是沒傳回 Content-type: text/html 再加上一列空白行分隔.

請檢查您的 CGI 程式是否有 print "Content-type: text/html\n\n";

2. 您的 CGI 程式呼叫 Perl 的 magic code 路徑不對.

在程式的第一行要放上 Perl 的呼叫路徑.

如 #! /usr/bin/perl 或 #! /usr/local/bin/perl

您可以 telnet 進主機之後, 下 which perl 指令來尋找.

或者向網管人員洽詢, 務必要查清楚 Perl 的正確路徑.

3. 欲開啟或寫入的檔案, 其絕對路徑或相對路徑錯誤.

例如 $guestbook_file="/home/your_dir/www/gbk.txt";

請查清楚此檔案的路徑是否正確?

4. 欲開啟或寫入的檔案或目錄, 其權限沒設好.

通常要寫入的檔案, 權限須設為 666, 僅供讀取的檔案, 權限設為 755.

或者讓 nobody 身份擁有寫入或讀取權.


5. 上傳 CGI 程式時, 沒有用 ASCII 模式上傳.

您是否錯用 Binary 模式上傳呢? 再用 ASCII 模式上傳一次吧?!

6. CGI 程式的語法有誤, 可能是忘了在某一列 Perl 敘述之後, 加上 ';' 這個結束符號, 

或是忘了加上括號() { }. 或者是其它語法錯誤所致.

7. CGI 程式本身的權限屬性沒設好, 通常 CGI 程式設為 755, 或者讓 nobody 身份擁有讀取及執行權.

8. 您可能是在印出 html 語法時, 忘了把雙引號中的其它雙引號給 meta 掉(或稱作 escape 掉).

例如: print "<font color="red">Hello</font>\n"; 便是錯誤的語法.

應改成 print "<font color=\"red\">Hello</font>\n";

也就是說在雙引號中, 若要有雙引號, 應寫成 \" 來 替代 " .

比較方便的做法是使用 perl 的 qq, 可將上面改寫成:

print qq(<font color="red">Hello</font>\n);

或者, 使用 Here document 的寫法:

print <<HERE;

 <font color="red">Hello</font>
 ..............................

HERE


9. 上傳至 Unix/Linux/FreeBSD 主機之後, 每列結尾出現 ^M 的符號. 

請將這些符號刪除即可.

10.若您的程式有利用 DBI+DBD 撰寫 SQL 資料庫程式, 

則當某些 SQL 語法錯誤時, 也會產生 Error 500.


11.您的程式有使用 die 語法來 catch error, 而沒有做適當的 "錯誤或例外處理".

12.您 require 某一個 perl file, 但該 perl file 並不存在, 或者路徑錯誤.

13.您引用的 Perl 模組(module), 並未安裝好, 

或者, 您忘了加 use 語法來引用模組, 卻用了某一模組的函式功能.

14.在 Win95/98 中試圖使用 flock 語法來 "鎖定/解開" 檔案, 也會發生 Error 500.