我正在浏览互联网并注意到,例如,YouTube包含一个这样的网址来表示视频页面:http://www.youtube.com/watch?v=gwS1tGLB0vc
。
我的网站为主题页面使用了这样的网址:http://www.example.com/page.php?topic_id=6f3246d0sdf42c2jb67abba60ce33d5cc
。
不同之处在于,如果你还没有注意到在youtube上,他们的观看页面没有文件扩展名,所以我想知道,为什么有些网站没有使用文件扩展名以及它有什么用途? ?
答案 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.mp3或http://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";
答案 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
中的代码重定向404ErrorDocument 404 /404.html
重要的是代码正在为我的网站工作。
那些不需要文件扩展名。
答案 12 :(得分:-4)
“www.youtube.com/watch”是YouTube的目录。所以它基本上可以写成“www.youtube.com/watch/”,结尾正斜杠。