是否有可能用PHP计算出网站索引的文件名


Is it possible to work out what the filename of the index of a website is with PHP?

以以下场景为例:

  1. 用户输入"http://example.com/index.html"到我的表单
  2. 表单被发送到执行file_get_contents("http://example.com/index.html")的后端脚本
  3. PHP脚本将返回的html保存到名为"site.html"的文件中(文件扩展名基于给定地址的扩展名)

现在考虑第二个例子:

  1. 用户输入"http://example.com"到我的表单
  2. 表单被发送到执行file_get_contents("http://example.com")
  3. 的后端脚本PHP脚本将返回的html保存到名为"site.com"的文件中(文件扩展名基于给定地址的扩展名)

显然这个方法不是理想的,因为文件"site.com"现在是相当无用的。

我的问题是,有没有一种方法可以让PHP计算出它得到的文件类型?在第二个示例中,根据服务器设置,它可以是"index.html""default.asp"之间的任何值。

您可以查看Content-Type HTTP头来找出您正在获得的文件的类型 -但是您无法找出服务器上使用的文件名是什么(或者即使有文件名),并且(在大多数情况下)index.html和default.asp都将返回HTML文档

如果example.com与PHP运行的服务器不同,则不能。选项:你可以蛮力,即尝试不同的可能的文件名(index.htm, index.html, index.php, index.asp, default.html等…)

好吧,不管怎样,它将是HTML文件。所以一定要使用HTML扩展名

这里有两点:

  • 首先,如果您只是请求一个目录的根目录,则不可能计算出所服务的文件的名称。这是由web服务器内部处理的,它不会告诉客户端它是如何处理的。对不起。
  • 第二-当然你可以给所有的文件一个.html扩展名,如果没有指定文件名?在99%的情况下,所提供的默认文件是HTML,即使它是.asp.php扩展,它所输出的都是动态生成的HTML。你不会得到源代码,只会得到结果。

编辑

这是我能想到的最好的解决方案,以确定一个合理的文件扩展名纯粹基于URL:

$urlParts = parse_url($url);
if (!isset($urlParts['path'])) $ext = 'html'; else {
  $pathParts = explode('/',$urlParts['path']);
  $ext = (count($fileParts = explode('.',array_pop($pathParts))) > 1) ? array_pop($fileParts) : 'html';
}

您不能真正使用URL来确定您得到的响应类型。您需要的是来自Content-Type响应头的MIME类型。

你可以从自动填充的$http_response_header变量中提取这个头。下面的示例将获取URL的内容,并将响应的Content-Type映射到文件扩展名....

$typeMap=array(
        'text/html'  =>'.html',
        'text/plain' =>'.txt',
        'image/jpeg' =>'.jpeg',
        #you get the idea...
);
$html=file_get_contents("http://www.google.com");
$ext='.html';//assume html, and prove otherwise....
//examine the headers
foreach($http_response_header as $hdr)
{
        list($name,$value)=explode(':', $hdr, 2);
        if ($name=='Content-Type')
        {
                #naive parse of content type
                list($type,$extra)=explode(';', $value, 2);
                if (isset($typeMap[$type]))
                        $ext=$typeMap[$type];
                //no need to look at more headers
                break;
        }
}