2010-01-06 131 views
1

如果我在PHP中顯示URL鏈接,有什麼方法可以在用戶點擊後檢查合法性,以向用戶顯示一個很好的自定義消息,指出該URL已損壞或類似?在PHP中檢查URL是否存在

我不是說錯誤404頁面。我猜404錯誤只適用於內部網站頁面,而不是外部鏈接。如果我錯了,請糾正我。

回答

0

404適用於任何未找到的資源。如果一個鏈接指向一個鏈接,那麼這個服務器的任務就是不存在這個資源來給你這個消息。引述RFC for HTTP Status Codes

10.4.5 404未找到

服務器沒有找到任何匹配 Request-URI中。否 指示 條件是暫時的還是永久性的。 如果服務器通過內部可配置機制 知道舊資源永久爲 不可用且沒有轉發 地址,則應使用410(Gone)狀態碼爲 。當服務器不希望 準確揭示爲什麼請求有 被拒絕或者沒有其他 響應適用時,使用此狀態代碼通常爲 。

此外,單擊瀏覽器中的鏈接會在PHP完成頁面很久之後發生。 PHP是服務器端,而用戶交互發生在用戶的計算機上與此完全隔離。因此,無法用PHP捕獲點擊。

如果您想捕獲點擊(事實上並非如此),您必須將所有外部鏈接路由到您自己的網絡服務器,以便通過get_headers()預取鏈接以查看資源是否存在。如果沒有,您可以將自己的自定義頁面呈現給用戶。但請記住,這實際上是在執行兩個HTTP請求。首先從用戶到你的服務器,然後再從服務器到外部網頁和你的外部鏈接很可能是這樣的:

http://www.yourserver.com/external.php?url=example.com/someuri 
1

簡短的答案是 - 沒有。

單擊鏈接會導致用戶的瀏覽器從它所在的服務器請求資源。您的服務器不參與。

可以寫一些JavaScript代碼解除連接的正常行爲,使用Ajax對您的服務器發出請求,讓PHP服務器上做出相應的第三方網站的請求,檢查響應,響應Ajax請求,然後將location設置爲原始URL或一個用於您的錯誤消息......但這會顯着降低用戶的性能。

如果您擔心您提供的鏈接被破壞,請定期檢查它們。您可以自動執行此操作(例如,使用checklink

1

您應該使用fsockopen先查找鏈接的響應代碼,然後在其顯示爲小於400時顯示它。請參閱http://www.scriptol.com/how-to/http-status-code-in-php.php。也許最好的想法是在斷開的鏈接旁邊顯示警告(通過CSS或javascript輕鬆實現)。

+1

手動滾動您自己的HTTP堆棧?使用cURL函數獲取頭文件不是簡單嗎? – symcbean 2010-01-06 17:17:58

+1

@symcbean使用內置的get_headers()函數(http://docs.php.net/get_headers)會更加容易。 – Inspire 2010-01-06 17:28:18

4

我的建議:編寫一個定期檢查URL(使用curl或fsockopen)並將其標記在數據中的PHP批處理作業。通過這種方式,您知道該URL在之前會打破,並將其顯示給用戶。