reCAPTCHA xác thực rằng mã thông báo được sử dụng trên cùng một miền mà chúng được tạo. Khi có sự không khớp giữa cấu hình miền của CAPTCHA và nguồn yêu cầu thực tế, bạn sẽ gặp phải lỗi xác minh miền. Những lỗi này diễn ra âm thầm — mã thông báo có vẻ hợp lệ nhưng máy chủ từ chối nó. Hướng dẫn này bao gồm mọi tình huống lỗi liên quan đến miền và cách khắc phục.
Cách xác minh tên miền hoạt động
Site owner registers reCAPTCHA → adds allowed domains (example.com, www.example.com)
↓
reCAPTCHA widget loads on example.com → matches allowed domain ✓
↓
Token generated with embedded hostname
↓
Server validates token via siteverify API
↓
Google checks: Does token hostname match allowed domains?
├─ YES → { "success": true, "hostname": "example.com" }
└─ NO → { "success": false, error or hostname mismatch }
Tên miền được kiểm tra ở đâu
| điểm kiểm tra | Những gì được xác minh |
|---|---|
| Phía khách hàng | Chỉ tải tiện ích trên các miền được phép (tùy chọn - có thể bị tắt) |
| Tạo mã thông báo | Tên máy chủ được nhúng trong mã thông báo khớp với nguồn gốc của trang |
| Xác thực máy chủ | siteverify trả về tên máy chủ - máy chủ phải xác minh nó khớp |
Các lỗi xác minh tên miền phổ biến
Lỗi 1: Tên máy chủ không khớp trong phản hồi xác minh trang web
{
"success": true,
"hostname": "subdomain.example.com",
"challenge_ts": "2025-01-15T10:30:00Z"
}
Mã thông báo hợp lệ nhưng trường hostname hiển thị miền khác với dự kiến. Một số triển khai máy chủ từ chối điều này:
# Server-side validation that checks hostname
def validate_token(token, secret_key, expected_hostname):
result = requests.post(
"https://www.google.com/recaptcha/api/siteverify",
data={"secret": secret_key, "response": token},
).json()
if not result.get("success"):
return False
# This check causes failures when hostnames don't match
if result.get("hostname") != expected_hostname:
return False # Domain mismatch!
return True
Nguyên nhân:
- Đã giải quyết mã thông báo cho
www.example.comnhưng được xác thực trênexample.com - Đã giải quyết mã thông báo cho
staging.example.comnhưng được xác thực trênexample.com - Proxy hoặc CDN thay đổi tên máy chủ rõ ràng
Khắc phục: Đảm bảo pageurl trong yêu cầu bộ giải của bạn khớp chính xác với miền nơi mã thông báo sẽ được gửi.
Lỗi 2: Widget từ chối tải
Tiện ích reCAPTCHA hiển thị lỗi hoặc không hiển thị:
ERROR: Invalid domain for site key
Nguyên nhân:
- Các miền được phép của khóa trang web không bao gồm miền của trang hiện tại
- Đang tải tiện ích từ localhost hoặc tệp:Giao thức //
- Sử dụng địa chỉ IP thay vì tên miền
Khắc phục sự cố tự động hóa: Đây là sự cố cấu hình của chủ sở hữu trang web. Để giải quyết, hãy đảm bảo bạn chuyển đúng pageurl phù hợp với miền được phép.
Lỗi 3: Mã thông báo bị từ chối mặc dù giải quyết đúng
{
"success": false,
"error-codes": ["invalid-input-response"]
}
Mã thông báo được tạo cho một miền khác với nơi nó đang được xác thực.
Nguyên nhân tự động hóa phổ biến: pageurl được gửi tới bộ giải không khớp với miền mục tiêu thực tế:
# WRONG: pageurl doesn't match actual target
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": "https://staging.example.com/qa-login", # ← Must match actual domain
"json": 1,
})
# But submitting token to:
requests.post("https://app.staging.example.com/qa-login", ...) # Different subdomain!
Quy tắc khớp tên miền
Kết hợp chính xác với ký tự đại diện
Theo mặc định, xác minh tên miền của reCAPTCHA không đối sánh tên miền phụ nghiêm ngặt. Hành vi này phụ thuộc vào cấu hình của chủ sở hữu trang web:
| Tên miền đã đăng ký | Nguồn gốc được chấp nhận |
|---|---|
example.com |
example.com, www.example.com, sub.example.com (nếu bật ký tự đại diện) |
www.example.com |
Chỉ www.example.com (nếu nghiêm ngặt) |
*.example.com |
Bất kỳ tên miền phụ nào của example.com |
localhost |
Chỉ localhost (để phát triển) |
Hành vi tên máy chủ phía máy chủ
Khi xác thực thông qua xác minh trang web, hostname trong phản hồi phản ánh trang nơi mã thông báo được tạo. Máy chủ của chủ sở hữu trang web quyết định có chấp nhận nó hay không:
# Permissive validation (accepts any subdomain)
def validate_permissive(token, secret, base_domain):
result = requests.post(
"https://www.google.com/recaptcha/api/siteverify",
data={"secret": secret, "response": token},
).json()
if not result.get("success"):
return False
hostname = result.get("hostname", "")
return hostname == base_domain or hostname.endswith(f".{base_domain}")
# Strict validation (exact match only)
def validate_strict(token, secret, expected_hostname):
result = requests.post(
"https://www.google.com/recaptcha/api/siteverify",
data={"secret": secret, "response": token},
).json()
return result.get("success") and result.get("hostname") == expected_hostname
Sửa lỗi tên miền trong tự động hóa
Cách 1: So khớp chính xác pageurl
Cách khắc phục phổ biến nhất - đảm bảo pageurl khớp với mục tiêu thực tế:
# Correct: pageurl matches where you'll submit the token
target_url = "https://staging.example.com/qa-login"
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": "6LcR_RsTAAAAAN_r0GEkGBfq3L7KmU5JbPHJtwNp",
"pageurl": target_url, # Must match the actual domain
"json": 1,
})
Cách 2: Xử lý www và không phải www
from urllib.parse import urlparse
def normalize_url(url):
"""Normalize URL for consistent domain matching."""
parsed = urlparse(url)
# Use exactly what the target site uses
# Check if the site redirects www → non-www or vice versa
return f"{parsed.scheme}://{parsed.netloc}{parsed.path}"
# Test which variant the site uses
response = requests.get("https://staging.example.com/qa-login", allow_redirects=True)
actual_url = response.url # May be https://staging.example.com/qa-login after redirect
Cách 3: Phát hiện đúng tên miền từ chuỗi chuyển hướng
Một số trang web chuyển hướng qua nhiều tên miền:
def get_final_url(url):
"""Follow redirects to find the actual CAPTCHA page domain."""
response = requests.get(url, allow_redirects=True, timeout=15)
return response.url
# Login URL might redirect:
# https://staging.example.com/qa-login → https://auth.staging.example.com/qa-login
final_url = get_final_url("https://staging.example.com/qa-login")
# Use final_url as pageurl for solver
Khắc phục 4: Trích xuất tên miền từ URL gọi lại reCAPTCHA
from bs4 import BeautifulSoup
from urllib.parse import urlparse
def extract_recaptcha_domain(html, page_url):
"""Extract the domain reCAPTCHA uses for token binding."""
soup = BeautifulSoup(html, "html.parser")
# Check for reCAPTCHA iframe
iframe = soup.find("iframe", src=lambda s: s and "recaptcha" in s)
if iframe:
src = iframe.get("src", "")
# The iframe URL may contain the domain parameter
if "domain=" in src:
# Extract domain from iframe URL
pass
# Default: use the page URL's domain
return urlparse(page_url).netloc
Công cụ chẩn đoán xác minh tên miền
import requests
from urllib.parse import urlparse
class DomainDiagnostic:
"""Diagnose domain verification issues for reCAPTCHA solving."""
def __init__(self, target_url):
self.target_url = target_url
self.issues = []
def check_redirects(self):
"""Check if the URL redirects to a different domain."""
try:
response = requests.get(
self.target_url, allow_redirects=True, timeout=15,
headers={"User-Agent": "Mozilla/5.0 Chrome/120.0.0.0"},
)
final_url = response.url
original_domain = urlparse(self.target_url).netloc
final_domain = urlparse(final_url).netloc
if original_domain != final_domain:
self.issues.append({
"type": "redirect",
"message": f"Redirects from {original_domain} to {final_domain}",
"fix": f"Use pageurl: {final_url}",
})
return final_url
except Exception as e:
self.issues.append({"type": "error", "message": str(e)})
return self.target_url
def check_www_variant(self):
"""Check if www and non-www point to the same content."""
parsed = urlparse(self.target_url)
domain = parsed.netloc
if domain.startswith("www."):
alt_domain = domain[4:]
else:
alt_domain = f"www.{domain}"
alt_url = self.target_url.replace(domain, alt_domain)
try:
alt_response = requests.get(alt_url, allow_redirects=True, timeout=10)
alt_final = urlparse(alt_response.url).netloc
if alt_final != domain and alt_final != alt_domain:
self.issues.append({
"type": "www_redirect",
"message": f"{alt_domain} redirects to {alt_final}",
})
except Exception:
pass
def report(self):
"""Generate diagnostic report."""
final_url = self.check_redirects()
self.check_www_variant()
print(f"Target URL: {self.target_url}")
print(f"Final URL: {final_url}")
print(f"Use as pageurl: {final_url}")
if self.issues:
print("\nIssues found:")
for issue in self.issues:
print(f" [{issue['type']}] {issue['message']}")
if "fix" in issue:
print(f" Fix: {issue['fix']}")
else:
print("\nNo domain issues detected.")
# Usage
diag = DomainDiagnostic("https://staging.example.com/qa-login")
diag.report()
Bảng khắc phục sự cố
| Triệu chứng | Có khả năng gây ra | Chẩn đoán | sửa chữa |
|---|---|---|---|
| Mã thông báo luôn bị từ chối | pageurl không khớp với tên miền mục tiêu | So sánh pageurl của người giải quyết với miền gửi thực tế | Cập nhật pageurl để phù hợp |
| Hoạt động trên www, không hoạt động trên không www | Biến thể tên miền không khớp | Kiểm tra hành vi chuyển hướng | Sử dụng biến thể mà trang đích sử dụng (theo chuyển hướng) |
| Đôi khi hoạt động, đôi khi thất bại | CDN hoặc bộ cân bằng tải phục vụ các miền khác nhau | Kiểm tra xem tên miền có thay đổi theo yêu cầu không | Sử dụng URL nhất quán từ chuỗi chuyển hướng |
| Hoạt động trong trình duyệt, không thành công trong tập lệnh | Tập lệnh gửi từ nguồn khác | So sánh thanh URL của trình duyệt với pageurl của tập lệnh | Khớp URL cuối cùng của trình duyệt |
| Mã thông báo doanh nghiệp bị từ chối | Liên kết sai dự án hoặc miền | Xác minh khóa trang web Doanh nghiệp khớp với tên miền | Kiểm tra cài đặt miền bảng điều khiển doanh nghiệp |
Câu hỏi thường gặp
CaptchaAI có tự động xử lý xác minh tên miền không?
CaptchaAI tạo mã thông báo được liên kết với pageurl mà bạn cung cấp. Bạn phải đảm bảo URL này khớp với miền nơi bạn sẽ gửi mã thông báo. CaptchaAI không xác minh cấu hình miền — nó sử dụng bất kỳ url trang nào bạn chỉ định.
Tôi có thể giải CAPTCHA cho một tên miền và sử dụng nó trên tên miền khác không?
Không. Mã thông báo reCAPTCHA bị ràng buộc với miền mà chúng được tạo. Không thể sử dụng mã thông báo được tạo cho example.com trên other-site.com. Ngay cả các tên miền phụ khác nhau cũng có thể bị lỗi nếu trang web xác thực tên máy chủ một cách nghiêm ngặt.
Tại sao mã thông báo của tôi hoạt động được trong quá trình thử nghiệm nhưng lại thất bại trong quá trình sản xuất?
Nguyên nhân phổ biến: (1) Thử nghiệm sử dụng localhost có quy tắc miền khác nhau, (2) Sản xuất sử dụng CDN với miền khác, (3) Sản xuất có xác thực tên máy chủ chặt chẽ hơn, (4) Đường dẫn URL hoặc chuỗi chuyển hướng khác trong sản xuất.
Đường dẫn có quan trọng không, hay chỉ tên miền?
Chỉ tên miền (tên máy chủ) được xác thực bằng reCAPTCHA. Đường dẫn (/login, /signup) không ảnh hưởng đến việc xác minh tên miền. Tuy nhiên, bạn vẫn nên sử dụng URL đầy đủ chính xác là pageurl vì một số triển khai bộ giải có thể sử dụng nó cho các mục đích khác.
Tóm tắt
Xác minh tên miền reCAPTCHA liên kết mã thông báo với tên máy chủ nơi chúng được tạo. Lỗi tự động hóa phổ biến nhất là pageurl không khớp — URL được chuyển đếnCaptchaAIphải khớp với tên miền nơi mã thông báo sẽ được gửi. Thực hiện theo các chuyển hướng để tìm tên miền thực, xử lý các biến thể www và không phải www và sử dụng công cụ chẩn đoán tên miền để xác định các điểm không khớp trước khi giải quyết.
bài viết liên quan
- Cách giải quyết cuộc gọi lại Recaptcha V2 bằng Api
- Xử lý cửa quay Recaptcha V2 trên cùng một trang web
- Các lỗi Captcha hình ảnh lưới phổ biến và cách sửa