首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP cURL 訪問域名返回 405 Method Not Allowed 解決方案:強制 GET 請求

     編輯:PHP 綜合知識

錯誤現象

HTTP/1.1 405 Method Not Allowed

cURL 預設使用 POST 方式請求,部分站點(如 amazon.cn)僅允許 GET,導致 405 錯誤。

解決方案:明確指定 GET 並加入 Header

<?php
$ch = curl_init();

$url = 'https://www.amazon.cn';

// 設定 Header 模擬瀏覽器行為
$header = array(
    'Accept: application/json',
    'Accept-Encoding: gzip',
);

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);              // 包含回應標頭
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);      // 追蹤重導向
curl_setopt($ch, CURLOPT_NOBODY, 1);              // 僅取標頭(HEAD 請求)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');

// 關鍵:強制使用 GET 方法
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

// HTTPS 站點需跳過 SSL 驗證(或配置 CA)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

// User-Agent 模擬
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11');

$html = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

var_dump($info['http_code']); // 應為 200

關鍵參數對照

參數值作用
CURLOPT_CUSTOMREQUEST'GET'覆蓋預設 POST,強制指定 HTTP 方法
CURLOPT_NOBODY1發送 HEAD 請求(不回傳 Body),配合 GET 可用 0
CURLOPT_HTTPHEADERHeader 陣列模擬瀏覽器 Accept/Encoding,降低被擋風險

命令列驗證

# 直接測試 GET
curl -v www.amazon.cn

# 測試 POST(會得到 405)
curl -v -X POST www.amazon.cn

延伸:通用 HTTP 請求封裝

function http_request($url, $method = 'GET', $data = null, $headers = [], $options = []) {
    $ch = curl_init();
    
    $default_options = [
        CURLOPT_URL            => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_SSL_VERIFYHOST => 2,
        CURLOPT_USERAGENT      => 'Mozilla/5.0 (compatible; PHP Bot)',
        CURLOPT_ENCODING       => 'gzip, deflate',
    ];
    
    // 合併選項
    $opts = $default_options + $options;
    $opts[CURLOPT_CUSTOMREQUEST] = strtoupper($method);
    
    if ($data && in_array(strtoupper($method), ['POST', 'PUT', 'PATCH'])) {
        $opts[CURLOPT_POSTFIELDS] = is_array($data) ? http_build_query($data) : $data;
    }
    
    if ($headers) {
        $opts[CURLOPT_HTTPHEADER] = $headers;
    }
    
    curl_setopt_array($ch, $opts);
    $response = curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);
    
    return ['body' => $response, 'info' => $info];
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved