如何来一些网站的url不包括文件扩展名?
我正在浏览互联网,并注意到,例如,YouTube包含一个像这样的URL来表示video页面: http://www.youtube.com/watch?v=gwS1tGLB0vc
: http://www.youtube.com/watch?v=gwS1tGLB0vc
。
我的网站使用这样的URL作为主题页面: http://www.example.com/page.php?topic_id=6f3246d0sdf42c2jb67abba60ce33d5cc
: http://www.example.com/page.php?topic_id=6f3246d0sdf42c2jb67abba60ce33d5cc
。
不同之处在于,如果您还没有注意到YouTube上没有文件扩展名,那么我想知道, 为什么有些网站不使用文件扩展名,它的用途是什么?
不使用文件扩展名是因为URI(因此URL)应该与实现无关 – 如果你想访问George W. Bush的地址,你应该可以访问http://www.whitehouse.gov/总统/乔治布什/地址; (例如)。 无论白宫的服务器是使用PHP还是Python或Perl,对最终用户都无关紧要,所以他们不应该看到它。 最终用户并不关心网页是如何生成的,因为所有的网页语言都会输出相同的HTML,CSS等,他们只是在网页浏览器中查看网页。
大多数Web框架默认都会构build这个function,正是因为这个原因,无论在大多数Web服务器中使用URL重写,它都可以完成。 这个理想被编入W3C风格指南,这无疑是这个理念被广泛接受的大支持者。 在他们的指南中指出, “酷URIs不要改变” ,如果你仍然不理解这里的推理,应该把事情弄清楚。 该文件是关于这个问题的最终说明,也是框架事实上的标准。
值得注意的是,通常下载的文件 (有时候是AJAX中使用的数据文件)的文件扩展名仍然保持不变 – http://example.com/song.mp3或http://example.com/whitepaper .pdf – 因为它们打算保存到最终用户的计算机上,在那里文件扩展名重要。 扩展名不包括简单显示的页面 – 这是大多数页面。
你所看到的是一个URL路由的例子。 而不是指向一个特定的文件(例如page.php),服务器正在使用一个路由表或configuration,将请求引导到一个处理程序,该处理程序实际上呈现html(或其他任何取决于返回的MIMEtypes)。 如果您注意到,StackOverflow使用相同的机制。
有或没有扩展是无关紧要的。 浏览器作用于服务器返回的MIMEtypes,而不是URL中使用的任何扩展名。
当你问'为什么? 你是要求技术理由还是devise理由? 有些人已经回答了技术,所以我只是对devise发表评论。
基本上它归结为该url是一个端点。 这是用户/服务需要到达的地方。 这个扩展在大多数情况下是不相关的。 如果用户正在浏览网页并访问http://site.com/users,他正在等待用户列表。; 他不在乎它不会说.html或.php。 而作为使用这些扩展的devise师并不合理。 您希望您的应用程序有意义,而这些扩展并不能真正提供用户所需的任何洞察。
你想要使用它们的时间是如果你正在创build一个其他应用程序将使用的服务。 然后,您可以select使用扩展名来表示可以返回的数据types(.json,.xml等)。 有些人正在为这些东西devise指导方针和规格,但这一切都很早
基本上这些扩展使用,因为这是默认情况下Web服务器/客户端的工作方式。 随着网站的发展日趋成熟,我们开始更专业地处理网站,并试图让他们阅读/使用它们。
虽然扩展对浏览器无关紧要,但浏览器只是使用传递给它的头文件来确定要显示的内容以及如何显示它,但它们在服务器上的确很重要。 例如,你的盒子可以安装一个php和一个ruby解释器,但是你的web服务器有configuration文件来把文件扩展名映射到MIMEtypes。 例如,从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
(看起来更好,更简单的input和记住)到http://yourblog.com/articles.php?title=the-article-you-wrote
,Apache可以用来正确的路由请求到你的PHP脚本。
关键是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
那么,文件扩展名在互联网上没有任何用处。 浏览器不关心文件扩展名是什么。 你可以把一个CSS文件作为.avi。 那么为什么不直接离开呢? 这允许更短的URL。
此外,“重写”一个url允许更多可读的url。 你可能不了解/categories.php?id=455
但你确实/455-some-category
。
如果你想自己做,并使用Apache看看mod_rewrite。
url,应该被正确地认为是用户界面的一部分。 因此,它应该被devise为传达有关用户在网站上的位置以及网站的结构的信息。
url如:
mysite.com/sport/soccer/brazil_wins_worldcup
告诉用户很多关于网站的结构,以及他目前的位置。 相反:
mysite.com/article.php?cateogry=12&articleid=371
是无用的,相反,它暴露了不相关的实现细节,如用于制作网站的语言,以及该文章的标识(可能存储在该标识下的数据库中)
除此之外(不要将用户暴露给不相关的实现细节),这也有助于使网站具有前瞻性。 因为如果你从未公开过你select的语言,你可以升级到Ruby或者Python,而没有世界上所有指向你的链接,现在是404。
devise网站对于用户是有意义的, 并且是面向未来的。
有很多可能的答案。 这就是您的Web应用程序服务器如何configuration,从而导致您的Web浏览器正在解释的内容。 可能有些情况下,您正在使用URL重写或路由,正如其他人所说的,您提供了哪些处理程序来请求URL或扩展。
我可以有一个像“ http://cory.com/this/really/doesnt/exist ”这样的URL,如果我想要的话,它实际上是指向“ http://cory.com/this.does.exist.123 ”至。
Web服务器的正常行为是将请求的URIpath映射到文档根目录中的某个文件上。 所以http://example.com/foo/bar
简单地映射到/path/do/document/root/foo/bar
。 另外,Web服务器需要知道如何处理文件。 这通常通过文件扩展名来完成。 因此文件扩展名为.php
的文件由PHP解释器处理。
现在,除了这种正常行为之外,大多数Web服务器都具有允许更改映射(即, URL重写 )以及如何处理不具有文件扩展名的文件的方式的function。
在Apache Web服务器的情况下,前者可以用mod_rewrite完成:
RewriteEngine on RewriteRule ^/watch$ /watch.php
后者可以用mod_mime完成:
<File watch> ForceType application/x-httpd-php </File>
(好吧,实际上这不是mod_mimefunction,而是一个核心function。)
规则:文件扩展名不应包含在URI中
在Web上,句点(。)字符通常用于分隔URI的文件名和扩展部分。 REST API不应在URI中包含伪造文件扩展名来指示消息实体正文的格式。 相反,他们应该依靠通过Content-Type头部传递的媒体types来确定如何处理正文的内容。
(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提供的格式select机制,即Accept请求头。 引用:deviseREST API规则手册
下面是我用我的.htaccess使url仍然正常运行没有HTML或PHP扩展。
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.html -f
意味着如果浏览器中指定名称的文件与您的networking服务器中的目录(-d)或文件(-f)不匹配,则在下面重写规则
RewriteRule ^(.*)$ $1.html
我不知道如何下面的工作,但我认为,它重写后,如果它仍然不匹配,然后用PHP重写
RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php
如果仍然不匹配,将显示404页面。
您也可以使用下面的代码在.htaccess中redirect404
ErrorDocument 404 /404.html
代码正在为我的网站工作的重要性。
那些不需要文件扩展名。
“www.youtube.com/watch”是YouTube的目录。 所以基本上可以写成“www.youtube.com/watch/”,结尾正斜杠。