2011-06-24 23 views
24

Tôi vừa mới được tìm kiếm thông qua một trang web của error_log và một trong những lỗi đã được ghi lại một vài lần là:

[21-Jun-2011 12:24:03] PHP Notice: Undefined index: HTTP_USER_AGENT in /home/ukevents/public_html/lib/toro.php on line 130

Dòng này gắn liền với trong toro.php là:

private function ipad_request() { 
    return strstr($_SERVER['HTTP_USER_AGENT'], 'iPad'); 
} 

Có thể cho $_SERVER['HTTP_USER_AGENT'] không được đặt bởi yêu cầu HTTP không?

Trả lời

25

Có thể, tiêu đề HTTP này được gửi (hoặc không được gửi) bởi khách hàng và bạn không nên dựa vào nó. Từ php dẫn sử dụng:

Nội dung của User-Agent: tiêu đề từ các yêu cầu hiện tại, nếu có một

Vì vậy, các mã đúng sẽ là:

private function ipad_request() { 
    return isset($_SERVER['HTTP_USER_AGENT']) && strstr($_SERVER['HTTP_USER_AGENT'], 'iPad'); 
} 
6

Yes. Mọi trình duyệt hoặc tác nhân người dùng đều có thể chọn không gửi tiêu đề User-Agent. Nếu họ không gửi tiêu đề đó, $_SERVER['HTTP_USER_AGENT'] sẽ không được đặt.

Sử dụng isset() để đảm bảo rằng $_SERVER['HTTP_USER_AGENT'] được đặt.

private function ipad_request() { 
    if(!isset($_SERVER['HTTP_USER_AGENT'])) return false; 

    return strstr($_SERVER['HTTP_USER_AGENT'], 'iPad') !== false; 
} 
2

PHP docs nói:

'HTTP_USER_AGENT' Nội dung của User-Agent: tiêu đề từ các yêu cầu hiện tại, nếu có một.

(phần có liên quan nghiêng) để có vẻ như không phải lúc nào cũng được đặt.

4

Có, nó có thể, nhưng nó không bao giờ xảy ra cho một yêu cầu thường xuyên.

Tất cả trình duyệt đều gửi chuỗi trình duyệt trong yêu cầu, vì vậy mọi yêu cầu đến mà không có yêu cầu đến từ một số chương trình khác. Thậm chí tất cả các chương trình hoạt động tốt đều gửi một chuỗi trình duyệt, vì vậy bạn không phải lo lắng về việc không hiển thị trong công cụ tìm kiếm.

1

Ví dụ trong đó HTTP_USER_AGENT không được xác định là nếu yêu cầu đến từ trình xử lý trang 404 của GoDaddy cho trang web của bạn nơi bạn đã đặt trình xử lý là một trong các trang của bạn.