You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

cURL请求返回404但浏览器返回200的技术问题求助

排查cURL返回404但浏览器正常访问的问题

这种情况我碰过好多次了,大概率是网站的反爬机制或者请求环境差异导致的,咱们一步步排查:

1. 网站拦截了默认的cURL用户代理(User-Agent)

很多网站会通过检查请求的User-Agent字段区分脚本爬虫和真实浏览器,默认的cURL标识是类似curl/7.x.x的字符串,很容易被识别并拦截,直接返回404。

  • 快速排查:在命令行里模拟浏览器的UA试试,比如用Chrome的用户代理:
    curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" https://www.neptunestore.eu/fra/neptune-systems-module-de-surveillance-des-fluides.html
    
  • 解决思路:PHP脚本里给cURL设置CURLOPT_USERAGENT参数,命令行每次请求都带上-A参数指定浏览器的UA就行。

2. 缺少必要的请求头字段

除了User-Agent,有些网站还依赖AcceptAccept-LanguageReferer这些请求头来返回正确内容,cURL默认的请求头太简洁,不符合网站的要求,就会返回404。

  • 快速排查:打开浏览器开发者工具的Network标签,找到目标页面的请求,复制它的请求头,用cURL模拟这些头。比如:
    curl -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" -H "Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.5,en;q=0.3" -H "Referer: https://www.neptunestore.eu/fra/" -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" https://www.neptunestore.eu/fra/neptune-systems-module-de-surveillance-des-fluides.html
    
  • 解决思路:PHP里用CURLOPT_HTTPHEADER参数把这些必要的请求头加进去,尽量和浏览器的请求头保持一致。

3. 没有自动跟随重定向

有些网站会做3xx重定向(比如HTTP转HTTPS、路径调整),但cURL默认不会自动跳转,如果你请求的初始URL其实需要重定向到正确路径,没跟随的话就可能拿到404。

  • 快速排查:命令行加上-L参数让cURL自动跟随重定向:
    curl -L -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" https://www.neptunestore.eu/fra/neptune-systems-module-de-surveillance-des-fluides.html
    
  • 解决思路:PHP脚本里设置CURLOPT_FOLLOWLOCATIONtrue,命令行就用-L参数。

4. 服务器IP被封禁或地域受限

你的Debian服务器的公网IP可能被目标网站拉黑了(比如之前请求太频繁被当成爬虫),或者网站只允许特定地区的IP访问,而你浏览器用的IP是允许的。

  • 快速排查:先在服务器上用curl ifconfig.me拿到公网IP,然后用浏览器代理这个IP试试能不能打开目标页面;或者用ping www.neptunestore.eu看看连通性,也可以查一下该IP是否在网站的黑名单里。
  • 解决思路:如果是地域限制,就用服务器所在地区的代理IP;如果是IP封禁,要么联系网站解封,要么换个服务器IP,同时注意控制请求频率,别太激进。

5. URL编码出问题了

你的URL里有法语重音字符,终端编码如果不兼容的话,直接输入URL可能会被解析成错误的路径,导致请求到不存在的页面返回404。

  • 快速排查:用双引号把整个URL括起来再请求,避免终端解析错误:
    curl -A "Mozilla/5.0..." "https://www.neptunestore.eu/fra/neptune-systems-module-de-surveillance-des-fluides.html"
    
  • 解决思路:命令行里始终用双引号包裹URL;PHP里对路径中的特殊字符用urlencode()处理(注意别编码整个URL,只处理路径部分)。

6. 需要携带Cookie才能访问

有些网站依赖Cookie(比如会话ID、用户状态)返回内容,浏览器会自动保存Cookie,但cURL默认是无状态的,没带这些Cookie的话,网站可能认为你是未授权请求,返回404。

  • 快速排查:从浏览器开发者工具里复制目标页面的Cookie,用cURL带上:
    curl -A "Mozilla/5.0..." -H "Cookie: 这里填你从浏览器复制的Cookie内容" https://www.neptunestore.eu/fra/neptune-systems-module-de-surveillance-des-fluides.html
    
  • 解决思路:如果是必要的Cookie,可以先模拟浏览器登录获取Cookie,然后在后续请求中携带;PHP里可以用CURLOPT_COOKIEFILECURLOPT_COOKIEJAR来保存和加载Cookie。

内容的提问来源于stack exchange,提问作者Recif

火山引擎 最新活动