为什么有些网站网址不包含文件扩展名?

时间:2010-09-02 20:50:17

标签: url file-extension

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

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

不同之处在于,如果你还没有注意到在youtube上,他们的观看页面没有文件扩展名,所以我想知道,为什么有些网站没有使用文件扩展名以及它有什么用途? ?

13 个答案:

答案 0 :(得分:34)

不使用文件扩展名,因为URI(以及URL)应独立于实现 - 如果您想访问George W. Bush的地址,您应该可以转到http://www.whitehouse.gov/presidents/georgewbush/addresses(对于例)。白宫的服务器是使用PHP还是Python或Perl对最终用户来说无关紧要,所以他们不应该看到它。最终用户并不关心页面是如何生成的,因为所有Web语言都输出相同的HTML,CSS等,而他们只是在Web浏览器中查看页面。

大多数Web框架默认构建此功能,正是出于这个原因,无论在大多数Web服务器中进行URL重写,都可以实现。这种理想在W3C风格指南中被编纂,这无疑是这个想法得到广泛接受的一大支持者。它在他们的指南"Cool URIs Don't Change"中有所概述,如果您仍然不太明白这里的推理,那么应该清理一下。该文件是关于该问题的首要声明,也是框架的事实标准。

值得注意的是,通常最终下载的文件(有时候是AJAX中使用的数据文件)的文件扩展名仍然保持不变 - http://example.com/song.mp3http://example.com/whitepaper.pdf - 因为它们旨在保存到最终用户的计算机,其中文件扩展名很重要。对于简单显示的页面,这些扩展名不包括在内 - 这是大多数页面。

答案 1 :(得分:12)

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

答案 2 :(得分:7)

是否拥有扩展名是无关紧要的。浏览器对服务器返回的MIME类型起作用,而不是URL中使用的任何扩展名。

答案 3 :(得分:6)

当你问'为什么?'你在寻求技术原因或设计理由吗?有些人已经回答了技术问题,所以我只会对设计发表评论。

基本上归结为该url是一个端点。这是用户/服务需要达到的地方。在大多数情况下,扩展名无关紧要。如果用户正在浏览网页并转到http://site.com/users,则他需要一个用户列表。他不在乎它不会说.html或.php。而使用这些扩展的设计师并没有真正意义。您希望您的应用有意义,而这些扩展并未真正提供用户需要的任何洞察力。

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

基本上使用了这些扩展,因为这是Web服务器/客户端默认工作的方式。随着网络开发的成熟,我们开始更专业地处理网址,并试图让人们阅读/使用它们。

答案 4 :(得分:5)

虽然扩展程序对浏览器无关紧要,浏览器只使用传递给它的标头来确定要显示的内容以及如何显示它,但很可能它们在服务器上很重要。例如,您的盒子可能同时安装了php和ruby解释器,但您的Web服务器具有配置文件以将文件扩展名映射到MIME类型。例如,来自Apache的php5.conf:

  AddType application/x-httpd-php .php .phtml .php3

告诉Apache,以.php,.phtml和.php3结尾的文件应该被识别为PHP文件。

但是,由于扩展对客户端没有任何意义,因此如果没有它们,URL通常看起来“更好”。为了做到这一点,Apache mod_rewrite等技术可用于“重写”客户端陆地URL,以便在服务器上具有意义。

例如,您可以设置mod_rewrite规则来重写http://yourblog.com/article/the-article-you-wrote之类的网址(看起来更好,更容易输入并记住)到http://yourblog.com/articles.php?title=the-article-you-wrote,Apache可以使用它正确地将请求路由到您的PHP脚本。

答案 5 :(得分:2)

密钥是HTTP响应标头的Content-Type字段。这样的事情:

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";

更多详情:http://en.wikipedia.org/wiki/MIME

答案 6 :(得分:2)

嗯,文件扩展名在互联网上没有任何用处。浏览器不关心文件扩展名是什么。您可以将CSS文件作为.avi提供。那么为什么不简单地把它留下来呢?这样可以缩短网址。

此外,“重写”网址允许更可读的网址。您可能无法理解/categories.php?id=455,但有/455-some-category

如果您想自己动手并使用Apache,请查看mod_rewrite。

答案 7 :(得分:2)

网址应该被视为用户界面的一部分。因此,它应该旨在传达有关用户在网站上的位置以及网站结构的信息。

网址如:

mysite.com/sport/soccer/brazil_wins_worldcup

告诉用户很多关于网站结构以及他目前的位置。相反:

mysite.com/article.php?cateogry=12&articleid=371

没用,相反它暴露了不相关的实现细节,例如用于制作网站的语言,以及该文章的id是什么(可能存储在该id下的数据库中)

除了这个estethical论点(不要将用户暴露给无关的实现细节),它还有助于使网站面向未来。因为如果您从未公开过您选择的语言,您可以稍后升级到Ruby或Python,而不会指向世界上指向您的每个链接,现在是404。

设计网址对用户有意义,是面向未来的。

答案 8 :(得分:1)

这有很多可能的答案。这是您的Web应用程序服务器的配置方式,它会导致您的Web浏览器正在解释的内容。在某些情况下,您可能正在使用网址重写或路由,正如其他人所说,您为所请求的网址或扩展程序提供了哪些处理程序。

我可以拥有类似“http://cory.com/this/really/doesnt/exist”的网址,如果我愿意,可以指向“http://cory.com/this.does.exist.123”。

答案 9 :(得分:1)

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

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

对于Apache Web服务器,前者可以使用mod_rewrite

完成
RewriteEngine on
RewriteRule ^/watch$ /watch.php

后者可以使用mod_mime完成:

<File watch>
    ForceType application/x-httpd-php
</File>

(好吧,实际上这不是mod_mime功能,而是core功能。)

答案 10 :(得分:0)

规则:文件扩展名不应包含在URI

在Web上,句点(。)字符通常用于分隔文件名和 URI的扩展部分。 REST API不应包含人工文件扩展名 在URI中指示消息的实体主体的格式。相反,他们应该依靠 通过Content-Type标头传达的媒体类型,以确定如何 处理身体的内容。

(1)http://api.college.restapi.org/students/3248234/transcripts/2005/fall.json (2)http://api.college.restapi.org/students/3248234/transcripts/2005/fall

(1)不应使用文件扩展名来表示格式首选项。 (2)应鼓励REST API客户端使用HTTP提供的格式选择 机制,接受请求标头。 参考:设计REST api规则手册

答案 11 :(得分:0)

下面是我在.htaccess中使用的内容,使网址在没有HTML或PHP扩展名的情况下仍能正常运行。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f

表示如果浏览器中具有指定名称的文件与网络服务器中的目录(-d)或文件(-f)不匹配,则重写下面的规则

RewriteRule ^(.*)$ $1.html

我不确定以下是如何工作但我认为在用html重写之后如果它仍然不匹配它然后用php重写

RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

如果仍然不匹配,则显示404页面。

您还可以使用.htaccess

中的代码重定向404
ErrorDocument 404 /404.html

重要的是代码正在为我的网站工作。

http://mintnet.net/services

http://php.mintnet.net/home

那些不需要文件扩展名。

答案 12 :(得分:-4)

“www.youtube.com/watch”是YouTube的目录。所以它基本上可以写成“www.youtube.com/watch/”,结尾正斜杠。