有没有办法用php文件内容绕过403错误?

有没有办法用php文件内容绕过403错误?,php,file-get-contents,Php,File Get Contents,我正在尝试使用php文件获取一个特定的网页\u get\u contents-当我直接查看页面时没有问题,但当尝试使用php获取它时,我得到“无法打开流:HTTP请求失败!HTTP/1.1 403禁止”。我正试图从页面中提取一段数据 $ft = file_get_contents('https://www.vesselfinder.com/vessels/CELEBRITY-MILLENNIUM-IMO-9189419-MMSI-249055000'); echo $ft; 我在这里读了很多

我正在尝试使用php文件获取一个特定的网页\u get\u contents-当我直接查看页面时没有问题,但当尝试使用php获取它时,我得到“无法打开流:HTTP请求失败!HTTP/1.1 403禁止”。我正试图从页面中提取一段数据

$ft = file_get_contents('https://www.vesselfinder.com/vessels/CELEBRITY-MILLENNIUM-IMO-9189419-MMSI-249055000');

echo $ft;
我在这里读了很多关于使用stream\u context\u create的页面,主要是用户代理部分

$context  = stream_context_create(
array(
    "http" => array(
        "header" => "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
    )
)
))


但是什么都没用,我现在收到一条400错误信息。不幸的是,我的服务器似乎没有被配置为使用cURL,所以file\u get\u contents似乎是我实现这一点的唯一方法

您需要将
用户代理
头添加到实际头中:

$context  = stream_context_create(
  array(
    'http' => array(
      'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
    ),
));
您还可以使用
user\u agent
选项:

$context = stream_context_create(
  array(
    'http' => array(
      'user_agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
    ),
));
以上两个示例都应该可以使用,您现在应该能够使用以下工具获取内容:

$content = file_get_contents('https://www.vesselfinder.com/vessels/CELEBRITY-MILLENNIUM-IMO-9189419-MMSI-249055000', false, $context);

echo $content;
当然,也可以使用命令行中的curl来测试这一点。请注意,我们正在设置自己的
用户代理
标题:

curl --verbose -H 'User-Agent: YourApplication/1.0' 'https://www.vesselfinder.com/vessels/CELEBRITY-MILLENNIUM-IMO-9189419-MMSI-249055000'

还应该知道curl使用的默认
用户代理
似乎已被阻止,因此如果使用curl,您需要使用
-H
标志添加自己的代理

您需要将
用户代理
头添加到实际头中:

$context  = stream_context_create(
  array(
    'http' => array(
      'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
    ),
));
您还可以使用
user\u agent
选项:

$context = stream_context_create(
  array(
    'http' => array(
      'user_agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
    ),
));
以上两个示例都应该可以使用,您现在应该能够使用以下工具获取内容:

$content = file_get_contents('https://www.vesselfinder.com/vessels/CELEBRITY-MILLENNIUM-IMO-9189419-MMSI-249055000', false, $context);

echo $content;
当然,也可以使用命令行中的curl来测试这一点。请注意,我们正在设置自己的
用户代理
标题:

curl --verbose -H 'User-Agent: YourApplication/1.0' 'https://www.vesselfinder.com/vessels/CELEBRITY-MILLENNIUM-IMO-9189419-MMSI-249055000'

还应该知道curl使用的默认
用户代理
似乎已被阻止,因此如果使用curl,您需要使用
-H
标志添加自己的代理

Vesselfinder,您向其发出请求的服务,似乎拒绝自动解析其数据,正如@ADyson所说。阅读文档: 你可以向他们索要API代币,也许这是一个付费计划


他们有一个官方的API。您需要一个Api密钥。

您向其发出请求的服务Vesselfinder似乎拒绝自动解析其数据,正如@ADyson所说。阅读文档: 你可以向他们索要API代币,也许这是一个付费计划


他们有一个官方的API。您需要一个Api密钥。

否。它被称为@icecub,但CORS仅适用于从浏览器发出的ajax请求@阿德森:这可能是真的。我经常使用Ajax,所以公平地说,我从未意识到它只适用于它。也许我错了。我也会犯错误。这就是我发表评论而不是回答的原因。如果将同源策略应用于HTTP请求,是否意味着我们不可能在浏览器上导航到该页面?@Cyclonecode这可能是个问题,但我认为“大多数”有点主观。这取决于他们的策略,以及它是API还是基于浏览器的UI。如果它是一个基于浏览器的UI页面,那么通过PHP脚本访问它可能不是解决OP问题的好办法。它被称为@icecub,但CORS仅适用于从浏览器发出的ajax请求@阿德森:这可能是真的。我经常使用Ajax,所以公平地说,我从未意识到它只适用于它。也许我错了。我也会犯错误。这就是我发表评论而不是回答的原因。如果将同源策略应用于HTTP请求,是否意味着我们不可能在浏览器上导航到该页面?@Cyclonecode这可能是个问题,但我认为“大多数”有点主观。这取决于他们的策略,以及它是API还是基于浏览器的UI。如果它是一个基于浏览器的UI页面,那么通过PHP脚本访问它可能不是解决OP问题的好办法。但是,它现在可以工作了,因为您正在假装用户代理头不被识别为bot/脚本。@macghriogair-是的,当然这就是原因。但是,即使使用
用户代理
头,例如
用户代理:MyApplication/1.0
,这也应该可以工作,请求失败的原因是服务器不允许缺少此头的请求。但是“MyApplication/1.0”给出的状态为400。因此,至少他们似乎期望一些已知的浏览器代理字符串能够证实这一点。我想站点会阻止某些标题,例如
curl/*
谢谢,这很好。我很困惑,因为我以前尝试过一个用户代理,但它不起作用,所以我想字符串中有一些特定的东西。不管怎样,再次谢谢你。这很有效。但是,它现在可以工作了,因为您正在假装用户代理头不被识别为bot/脚本。@macghriogair-是的,当然这就是原因。但是,即使使用
用户代理
头,例如
用户代理:MyApplication/1.0
,这也应该可以工作,请求失败的原因是服务器不允许缺少此头的请求。但是“MyApplication/1.0”给出的状态为400。因此,至少他们似乎期望一些已知的浏览器代理字符串能够证实这一点。我想站点会阻止某些标题,例如
curl/*
谢谢,这很好。我很困惑,因为我以前尝试过一个用户代理,但它不起作用,所以我想字符串中有一些特定的东西。无论如何,再次谢谢你。