当使用file_get_contents从具有apache .htaccess重写规则的页面抓取html时,出现404错


Getting 404 error when using file_get_contents to scrape html from page that has apache .htaccess rewrite rule

我正在尝试从drupal 7站点抓取渲染的html。但由于重写规则,我无法使用file_get_contents或curl或任何东西来定位文件。当试图从服务器加载任何本地文件时,我总是得到"404文件未找到"错误。

我的站点设置为作为Drupal站点运行-它通过.htaccess重写规则从一个名为/drupal3/的文件夹中提供服务:

RewriteRule ^$ drupal3/index.php [L]
RewriteCond %{DOCUMENT_ROOT}/drupal3%{REQUEST_URI} -f
RewriteRule .* drupal3/$0 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* drupal3/index.php?q=$0 [QSA]

这些规则的基本作用是检查一个文件是否存在于drupal3/文件夹中,如果存在,则提供该文件。如果没有,检查它是否存在于drupal3/文件夹之外,如果存在,就提供给它。因此,mydomain.com现在指向mydomain.com/drupal3/,但仍然读取为mydomain.com作为它的url。这允许我仍然保留服务器上文件的原始url。

我的问题是,虽然网站行为正确,但似乎php无法遵循重定向规则和服务/打开最终文件。

$html = file_get_contents("http://mydomain.com");得到failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found

我也尝试curl与CURLOPT_FOLLOWLOCATION = true,但同样的问题。

任何人都可以给任何洞察力,我如何能够正确地获得从我的服务器提供的页面呈现的HTML内容?

欢呼

可能性1

取自PHP文档:file-get-contents

如果启用了fopen包装器,则URL可以用作该函数的文件名。有关如何指定文件名的更多详细信息,请参阅fopen()。有关各种包装器的功能、使用说明以及它们可能提供的任何预定义变量的信息的链接,请参阅支持的协议和包装器。

确保allow_url_fopen在服务器上是允许的。

可能性2

确保服务器可以正确解析域名。尝试获取其他外部站点。如果仍然是404错误,说明服务器的hosts文件有问题。

如果您的两个站点都托管在一个服务器上,您可以在您的file_get_contents中使用http://localhost/your-drupal-site