Phân tích Nginx logs: ChatGPT, Claude và Perplexity thực sự truy cập website như thế nào?
Bài viết chia sẻ kết quả phân tích nhật ký máy chủ Nginx để làm rõ cách các mô hình AI hàng đầu lấy dữ liệu từ website. Kết quả cho thấy sự khác biệt quan trọng giữa việc bot của AI tự động truy cập và lượt truy cập thực tế từ người dùng.

Tháng trước, tôi muốn tìm một câu trả lời thẳng thắn cho câu hỏi mà hầu hết các bài viết về khả năng hiển thị của AI thường lảng tránh: Khi ai đó hỏi ChatGPT, Claude, Perplexity, Gemini hoặc Google AI Mode về một trang web mà tôi sở hữu, sản phẩm AI đó có thực sự lấy (fetch) trang đó hay nó chỉ trả lời từ chỉ mục dữ liệu đã xây dựng trước đó?
Cách để có câu trả lời chính xác là phương pháp cũ kỹ nhưng hiệu quả: Đọc nhật ký truy cập Nginx. Bài viết này sẽ đi sâu vào những gì mà các nhật ký đã ghi nhận được từ năm sản phẩm AI tôi đã thử nghiệm, những gì chúng không ghi nhận, và sự khác biệt đó cho phép chúng ta theo dõi gì một cách an toàn.
Hai tín hiệu, không phải một
Khi một nhà tiếp thị nói "trang web của tôi có traffic từ AI", điều đó có thể mang hai ý nghĩa khác nhau, và nhật ký chứng minh chúng là hai việc hoàn toàn khác biệt.
Truy cập phía nhà cung cấp (Provider-side fetch): Nhà cung cấp AI tự động truy cập trực tiếp vào máy chủ gốc của bạn. Yêu cầu này thường đến với một user-agent chuyên dụng, thường không có referrer, và thường xuất hiện trong một loạt yêu cầu ngắn hạn trong khi mô hình đang quyết định trang nào để trích dẫn.
Lượt truy cập thực từ người dùng (Real clickthrough visit): Một con người đọc câu trả lời của AI, nhấp vào liên kết trích dẫn và đến trang web của bạn như một trình duyệt bình thường. User-agent dạng Chrome, cookie bình thường, và sản phẩm AI đóng vai trò là referrer.
Gộp chung hai cái này thành một con số "traffic AI" sẽ che mờ đi sự phân biệt hữu ích nhất trong dữ liệu. Một bên là mô hình đang tiếp cận để đọc bạn. Bên kia là con người đang đọc bạn vì mô hình đã chỉ dẫn. Đòn bẩy khác nhau, cách đo lường khác nhau, và nội dung hiển thị cũng khác nhau.
Cách tôi thiết lập thí nghiệm
Không có gì quá phức tạp. Tôi sử dụng một định dạng nhật ký Nginx tùy chỉnh để ghi lại các bit dữ liệu mà định dạng combined mặc định nén lại, cùng với lệnh tail -F chạy song song với một tab trình duyệt cho từng sản phẩm AI.
log_format ai_probe '$time_iso8601 $remote_addr "$request" $status '
'"$http_user_agent" "$http_referer"';
Tôi đã đưa ra các câu hỏi (prompt) cho từng sản phẩm AI được thiết kế để có khả năng tạo ra một trích dẫn hoặc yêu cầu việc lấy trang từ một tên miền mà tôi kiểm soát. Tôi chạy lại các prompt giống nhau qua nhiều phiên và IP khác nhau để đảm bảo một lần truy cập cache ngẫu nhiên không che giấu con đường truy xuất dữ liệu.
ChatGPT đã làm gì
Được ghi nhận một cách có thể tái lập qua nhiều lần chạy:
- User-agent chứa
ChatGPT-User/1.0. - Không có referrer trên các yêu cầu được ghi nhận.
- Nhiều trang ứng viên được lấy trong các burst ngắn trong khi ChatGPT đang soạn thảo câu trả lời.
- Quan sát thấy nhiều hơn một địa chỉ IP trong cùng một burst.
2026-03-18T14:23:41+00:00 203.0.113.42 "GET /a HTTP/1.1" 200 "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot" "-"
2026-03-18T14:23:41+00:00 203.0.113.58 "GET /b HTTP/1.1" 200 "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot" "-"
Điều này đủ để khẳng định phát hiện một cách rõ ràng: ChatGPT thực hiện việc truy xuất gốc phía nhà cung cấp thông qua ChatGPT-User. Mô hình burst qua nhiều IP phù hợp với mô tả của chính OpenAI về tác nhân này trong tài liệu về bot của họ.
Claude đã làm gì
Được ghi nhận:
- User-agent chứa
Claude-User/1.0. - Không có referrer trên các yêu cầu được ghi nhận.
- Yêu cầu
/robots.txtđược thực hiện trước tiên. - Các chuyển hướng (redirects) được theo dõi bình thường.
2026-03-19T09:14:08+00:00 198.51.100.11 "GET /robots.txt HTTP/1.1" 200 "Mozilla/5.0 (compatible; Claude-User/1.0; [email protected])" "-"
2026-03-19T09:14:09+00:00 198.51.100.11 "GET /plugins HTTP/1.1" 301 "Mozilla/5.0 (compatible; Claude-User/1.0; [email protected])" "-"
Kết quả tương tự: Claude thực hiện việc truy xuất gốc phía nhà cung cấp thông qua Claude-User. Việc kiểm tra robots trước phù hợp với hành vi được tài liệu hóa của Anthropic.
Perplexity đã làm gì
Được ghi nhận:
- User-agent chứa
Perplexity-User/1.0. - Quan sát thấy một lần lấy trực tiếp trên một trang sản phẩm cụ thể.
- Không có referrer trên yêu cầu đó.
Tuy nhiên, có một điểm tôi không thể khái quát hóa. Perplexity đã lấy dữ liệu từ gốc trong các lần chạy tôi ghi nhận, nhưng tôi chỉ ghi nhận được vài lần chạy Perplexity, và về mặt kiến trúc, Perplexity hoàn toàn có khả năng trả lời từ chỉ mục của riêng nó mà không cần đánh vào máy chủ gốc. Cách nói an toàn là Perplexity có thể thực hiện truy xuất gốc trực tiếp; việc nó có luôn làm như vậy hay không thì một file log đơn lẻ không thể chứng minh được.
Google và Gemini đã không chứng minh được điều gì
Tôi đã ghi nhận được các lượt truy cập thực từ người dùng từ https://gemini.google.com/ và https://www.google.com/. User-agent của trình duyệt bình thường, IP của người kiểm tra, và referrer là sản phẩm của Google. Đó là những người dùng thực sự đến sau khi đọc câu trả lời AI.
Tuy nhiên, tôi không ghi nhận được một yêu cầu truy xuất gốc riêng biệt nào dành cho Gemini hay Google AI Mode. Lý do cấu trúc còn quan trọng hơn khoảng trống dữ liệu này.
Google không công bố một user-agent truy xuất riêng biệt cho Gemini. Theo tài liệu về crawler của Google, AI Overviews và AI Mode trả lời từ cùng một chỉ mục Search mà Googlebot tạo ra. Một token Gemini-User xuất hiện trong access log không tồn tại vì đơn giản là Google không tạo ra nó.
Ba hệ quả thực tế đáng được nhắc mạnh:
- Một lượt truy cập Googlebot vào máy chủ của bạn không thể quy cho Gemini so với Search thường xuyên chỉ dựa trên yêu cầu đó.
- Chặn
Google-Extendedkhông ngăn chặn Googlebot. Nó chỉ kiểm soát việc liệu nội dung do Googlebot thu thập có được dùng để huấn luyện và làm nền (grounding) cho Gemini hay không. - Câu nói "Google không lấy trang của tôi trong bài kiểm tra" không thể quan sát được về mặt cấu trúc giống như cách nó làm với ChatGPT hay Claude. Sự im lặng từ Google không phải là bằng chứng cho thấy không có việc lấy dữ liệu.
Sự bất đối xứng này là phát hiện bị báo cáo sai nhiều nhất trong các bài viết về AI crawler.
Những gì sản phẩm có thể theo dõi an toàn
Chỉ gộp lại các lớp đã được chứng minh, có hai lớp theo dõi mà một sản phẩm có thể cung cấp mà không cần khẳng định quá mức.
Lấy dữ liệu từ nhà cung cấp (Provider fetch): Các user-agent truy xuất được tài liệu hóa bởi nhà cung cấp đánh vào máy chủ gốc của bạn.
ChatGPT-User(OpenAI)Claude-User(Anthropic)Perplexity-User(Perplexity)Meta-ExternalFetcher(Meta - bot truy xuất được tài liệu hóa mà tôi không quan sát thấy trong lần chạy này nhưng thuộc cùng lớp này)
Lượt truy cập thực (Real visit): User-agent trình duyệt bình thường với sản phẩm AI làm referrer.
chatgpt.comclaude.aiperplexity.aigemini.google.comgoogle.com(như một nhóm nguồn gốc rộng lớn hơn của Google, không có cách nào để tách biệt AI Mode khỏi Search cổ điển chỉ dùng HTTP)
Các bot lập chỉ mục tìm kiếm (OAI-SearchBot, Claude-SearchBot, PerplexityBot, Googlebot, Bingbot) không nên được gộp vào nhóm provider-fetch. Chúng không phải là tín hiệu truy xuất trực tiếp cho bất kỳ câu hỏi cụ thể nào của người dùng. Trộn chúng vào sẽ biến chỉ số thành nhiễu loạn.
Các bot huấn luyện (GPTBot, ClaudeBot, CCBot) lại là một tín hiệu riêng biệt nữa, và chúng không có chỗ trong một phép đếm truy xuất.
Tại sao cách dùng từ cẩn thận lại quan trọng
Bất kỳ chỉ số nào nói "ChatGPT đã lấy trang của bạn" khi log thực tế lại hiển thị PerplexityBot là một sản phẩm sẽ đúng về xu hướng nhưng sai về từng dòng dữ liệu riêng lẻ. Lần đầu tiên một người dùng nhìn vào một dòng và biết nó sai, toàn bộ bảng điều khiển sẽ mất đi sự uy tín.
Cách dùng từ cẩn thận có thể nhàm chán, nhưng đó là cách dùng duy nhất tồn tại được trước một khách hàng thông minh kiểm tra lại một dòng dữ liệu.
Phụ lục: Phân loại bot theo tài liệu nhà cung cấp
Thí nghiệm đã chứng minh ba bot truy xuất hoạt động: ChatGPT-User, Claude-User, Perplexity-User. Dưới đây là tập hợp đầy đủ được tài liệu hóa bởi các phòng lab lớn, được phân loại theo mục đích:
- Truy xuất (Retrieval): Lấy dữ liệu do người dùng khởi tạo, thường khi con người dán liên kết vào sản phẩm AI hoặc tác nhân đi theo liên kết thay người dùng.
- Lập chỉ mục tìm kiếm (Search Indexing): Thu thập trang để sản phẩm AI có thể trích dẫn chúng từ chỉ mục tại thời điểm trả lời.
- Huấn luyện (Training): Thu thập trang để huấn luyện các mô hình trong tương lai; không phải là tín hiệu truy xuất trực tiếp.
Năm điểm chính cần rút ra từ bảng phân loại này:
- Không có bot Gemini chuyên dụng. Gemini sử dụng nội dung được lập chỉ mục bởi Googlebot và được kiểm soát bởi Google-Extended.
- Claude có ba bot riêng biệt. ClaudeBot để huấn luyện; Claude-SearchBot để chỉ mục tìm kiếm của Claude; chỉ có Claude-User là tín hiệu truy xuất phía người dùng.
- Meta xuất bản ít nhất hai bot liên quan. Meta-ExternalFetcher là đối tác truy xuất.
- Copilot không có crawler riêng biệt. Copilot dựa trên chỉ mục Bing được tạo bởi Bingbot.
- Các lớp truy xuất đã được chứng minh trong thí nghiệm thuộc về lớp "Truy xuất" (Retrieval) trong bảng này. Các bot huấn luyện và lập chỉ mục tìm kiếm không được mong đợi sẽ đánh vào gốc để phản hồi một truy vấn cụ thể, nên sự vắng mặt của chúng trong logs không phải là bằng chứng chống lại chúng.



