瀏覽器遇到web server回應的status code 404相信大家都不陌生, 無論是IIS或是APACHE都一樣, 只要是找不到這個檔案, 就是回應 404 給client囉.
如何handle web的回應, 除了是要有更 friendly 的回應外, 對於網站管理員來說, 更希望獲得哪些檔案是 user 要, 但是 web 上沒有的. 還記得之前有篇網路轉寄的內容, 有個 web server 的404回應網頁很有趣, 自怨自艾半天, 讓人會心一笑, 這就是友善回應的一種應用. 但能將 404用程式做某種方式記錄或是通知方便管理員處理, 相信也是在某些應用下的重要功能(當然要依實際狀況來用, 因為實務上發生404的機會並不低).
現在我們來看看如何設定404的handler, 在IIS裡(此處以IIS6為例), 在web site level或是folder level都可以設定custom error(自記錯誤), 要處理404當然就是設定404的代碼改為URL, 並指定 /xxx/404handler.asp or /xxx/404handler.aspx , 此處要用的網頁程式是 asp 或 asp.net 皆可, 由於是類似內部 rewrite output 方法, 所以我們要拿到原始 client request 的檔案才有參考的價值, 以下以 asp 為例, 要取得原 request 檔案, 可以利用 Request.Servervariables(“HTTP_URL”) 來取得, 但這個內容會是這樣:
/xxx/404handler.asp?404;http://host_name/req/req.jpg
所以還得要自行加工一下取得 ; 之後的內容, 才是正確的原始 request 檔案全名, 程式如下:
strURL = Request.Servervariables(“HTTP_URL”)
strURL = Right(strURL, (Len(strURL) – (Instr(strURL, chr(59)))))
如此一來, strURL 就會拿到 http://host_name/req/req.jpg
參考內容來自於: Tracking 404 Errors in IIS
之後要寫出文字檔, 要記錄到資料庫, 或是要寄 mail 通知都可以依需要來撰寫程式碼.
接下來我們再看看 apache 的部分如何設定, apache 的設定也很單純, 是利用 ErrorDocument 這個標籤來描述, 可以參考 apache 的說明, 由於 ErrorDocument 可以用在 server config, virtual host, directory, .htaccess 這些地方, 這裡就舉比較常用的 virtual host 設定來說明, 看如何配合 php 將 404 網址取得.
首先在 <VirtualHost *:80> … </VirtualHost> 內新增一行
ErrorDocument 404 /xxx/404handler.php
接下來在 404handler.php 來取得原始 request 的檔案, 在 php 裡用 $_SERVER[‘REQUEST_URI’] 可以取得原始 request 從 / 以下的內容, 如:
/req/req.jpg
比較單純的是不用再自己解析字串, 比 asp 方便一些, 接下來的應用相信大家就都會囉, 一樣看是要記文字檔, 存 db 或是發信, 就看需要來撰寫囉.
rewrite 是依使用者 request 的內容來調整要重新輸出的內容, 而 status handler 則是依 server 處理後的 status 來調整輸出的內容, 二者都有相當大的功能及彈性, 如何應用, 就看大家的巧思囉.