为什么有些站点URL不包含文件扩展名?

为什么有些站点URL不包含文件扩展名?,url,file-extension,Url,File Extension,我在浏览互联网时注意到,例如,YouTube包含这样一个URL来表示视频页面:http://www.youtube.com/watch?v=gwS1tGLB0vc 我的网站使用这样的URL作为主题页面:http://www.example.com/page.php?topic_id=6f3246d0sdf42c2jb67abba60ce33d5cc 不同之处在于,如果您还没有注意到youtube上的watch页面没有文件扩展名,那么我想知道,为什么有些网站不使用文件扩展名,它有什么用?关键是HT

我在浏览互联网时注意到,例如,YouTube包含这样一个URL来表示视频页面:
http://www.youtube.com/watch?v=gwS1tGLB0vc

我的网站使用这样的URL作为主题页面:
http://www.example.com/page.php?topic_id=6f3246d0sdf42c2jb67abba60ce33d5cc


不同之处在于,如果您还没有注意到youtube上的watch页面没有文件扩展名,那么我想知道,为什么有些网站不使用文件扩展名,它有什么用?

关键是HTTP响应头的
内容类型
字段。诸如此类:

HTTP 200 OK
Content-Type: video/flv
Content-Length: 102345

DATA-DATA-DATA-DATA-DATA-DATA-....
另见:

Content-Disposition: attachment; filename=genome.jpeg;
     modification-date="Wed, 12 Feb 1997 16:29:51 -0500";

更多详细信息:

拥有或没有扩展是不相关的。浏览器根据服务器返回的MIME类型进行操作,而不是URL中使用的任何扩展。

您看到的是URL路由的一个示例。服务器没有指向特定的文件(例如page.php),而是使用一个路由表或配置,将请求定向到实际呈现html的处理程序(或根据返回的mime类型的任何其他内容)。如果您注意到,StackOverflow使用相同的机制。

对此有许多可能的答案。web应用程序服务器的配置方式决定了web浏览器所解释的内容。在某些情况下,您可能正在使用URL重写或路由,正如其他人所说,您正在为请求的URL或扩展提供什么处理程序


我可以有一个像“”这样的URL,如果我想的话,它实际上可以指向“”。

嗯,文件扩展名在互联网上没有任何用处。浏览器不关心文件扩展名是什么。您可以将CSS文件作为.avi提供。那么,为什么不干脆把它排除在外呢?这允许更短的URL

此外,“重写”url允许更可读的url。您可能不了解
/categories.php?id=455
,但您确实了解
/455某些类别


如果您想自己做这件事并且正在使用Apache,请查看mod_rewrite。

当您问“为什么”时,您是问技术原因还是设计原因?一些人已经回答了技术问题,所以我只对设计进行评论

基本上可以归结为url是一个端点。这是用户/服务需要到达的地方。在大多数情况下,扩展是不相关的。如果一个用户正在浏览web并转到,那么他需要一个用户列表。他不在乎它没有说.html或.php。作为一个设计师,使用这些扩展并没有真正的意义。你希望你的应用程序有意义,而这些扩展并不能真正提供用户需要的任何洞察力

如果您正在创建其他应用程序将使用的服务,则需要使用它们的时间。然后,您可以选择使用一个扩展来表示希望返回的数据类型(.json、.xml等)。有人在为这些东西制定设计指南和规格,但都还为时过早


基本上使用这些扩展是因为默认情况下web服务器/客户端就是这样工作的。随着web开发的成熟,我们开始更加专业地处理URL,并试图使其对阅读/使用URL的人有意义。

web服务器的正常行为是将请求的URI路径映射到文档根目录中的某个文件上。所以
http://example.com/foo/bar
只需映射到
/path/do/document/root/foo/bar
。此外,web服务器需要知道如何处理文件。这通常通过文件扩展名来完成。因此,文件扩展名为
.php
的文件由php解释器处理

现在,除了这种正常行为外,大多数web服务器都具有允许更改映射(即)和处理没有文件扩展名的文件的方式的功能

对于Apache web服务器,前者可以通过以下方式完成:

后者可通过以下方式实现:


ForceType应用程序/x-httpd-php

(好的,实际上这不是mod_mime功能,而是一个功能。)

不使用文件扩展名,因为URI(因此URL)应该独立于实现——如果您想访问CDC关于食品安全的信息,您应该能够访问(例如)。CDC的服务器是否使用PHP、Python或Perl对最终用户来说无关紧要,因此他们不应该看到它。最终用户不关心页面是如何生成的,因为为一个网页提供服务的所有语言都输出相同的HTML、CSS等,而用户只是在他们的web浏览器中查看页面

大多数web框架在默认情况下构建此功能,正是出于这个原因,并且无论在大多数web服务器中重写URL,都可以实现此功能。这一理念被编入了W3C风格的指南中,毫无疑问,它是这一理念的一大支持者,并被广泛接受。这在他们的指南中有概述,如果你仍然不太理解这里的理由,应该会把事情弄清楚。该文件是关于这个问题的正式声明,也是框架的事实标准

值得注意的是,通常最终被下载的文件(有时是AJAX中使用的数据文件)的文件扩展名仍然保持不变,或者是因为它们打算保存到最终用户的计算机上,而在那里文件扩展名很重要。扩展不包括简单显示的页面-这是大多数页面


附言:这个答案最初链接到的示例页面在某个时候停止存在,因为有时候URI确实会改变,尽管有最佳实践。我已经用CDC的食品安全页面取代了它,该页面已经以某种形式存在了多年。毫无疑问,多年来,许多不同的技术提供了这些内容,同时总是在完全相同的URL上提供这些内容
RewriteEngine on
RewriteRule ^/watch$ /watch.php
<File watch>
    ForceType application/x-httpd-php
</File>
  AddType application/x-httpd-php .php .phtml .php3
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
ErrorDocument 404 /404.html