2011-09-22 77 views
0

就拿这个场景为例:有没有可能计算出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"之间的任何值。

回答

2

你可以看一下在Content-Type HTTP头找出类型你得到的文件 - 但你不能找出什么在服务器上使用的文件名是(或者即使有文件名),和(在大多数情况下)index.html和default.asp都会返回一个HTML文档。

+1

你或许可以仍然流场景中获得头,或通过$ http_response_header –

+0

文件类型对我来说足够好,只要它能正确显示即可。清楚地调用一个php或asp文件.html将在这一点上没有什么区别,因为我只是获取生成的html,而不是原始脚本。 –

+0

我已经添加了一些示例代码,显示如何确定file_get_contents响应的内容类型 –

0

如果exam​​ple.com与其中一个PHP运行的服务器不同,则不能。 选择:你可以猜解,那就是尝试不同的可能的文件名(的index.htm,index.html的,的index.php的index.asp,default.html中,等...)这里

0

两点:

  • 首先,如果您刚刚请求目录的根目录,则无法计算出提供的文件的名称。这是由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'; 
} 
0

好了,反正这将是HTML文件。所以总是使用HTML扩展。

+0

它将是一个HTML文件?如果我要...'DirectoryIndex index.png index.jpeg index.gif',该怎么办?它*可能*是HTML,但你不能保证它。 – Quentin

+0

'if(preg_match('\ (。*)<\/body> /')){/ * OK * /}' –

+0

- 虽然这实际上并不匹配http://hixie.ch/advocacy/xhtml中的任何内容 - 可以有一个匹配的纯文本文档。 – Quentin

0

您无法真正使用该URL来确定您获得的响应类型。您需要的是Content-Type响应标题中的MIME type

您可以从自动填充的$http_response_header变量中提取此标题。下面是这将得到一个URL的内容的一个例子,并绘制响应文件扩展名的内容类型....

$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; 
     } 
} 
相关问题