隐藏页面扩展名(如StackOverflow)

时间:2009-11-18 22:00:48

标签: dynamic-data lamp file-extension

我想隐藏像stackoverflow那样的页面扩展名。以下是如何工作的?

http://stackoverflow.com/tags/foo
http://stackoverflow.com/tags/bar

我见过很多网站都这样做,但我仍然不知道这是如何实现的(我有一个LAMP堆栈)。

6 个答案:

答案 0 :(得分:6)

当Web服务器收到URL请求时,它必须决定如何处理它。经典的方法是将URL的头部映射到文件系统中的目录,然后让URL的其余部分导航到文件系统中的文件。因此,URL具有文件扩展名。

但是没有必要这样做,大多数新的Web框架都没有。他们让程序员定义如何将URL映射到要运行的代码,因此不需要文件扩展名,因为没有单个文件提供响应。

在您的示例中,没有包含文件“foo”和“bar”的“tags”目录。 “tags”URL映射到使用URL的其余部分(“foo”或“bar”)作为查询中对标签数据数据库的参数的代码。

答案 1 :(得分:3)

你想要的是干净的URL,你可以用apache和.htaccess来做。可能有更好的方法,但这就是我一直在做的事情:

http://evolt.org/Making_clean_URLs_with_Apache_and_PHP

答案 2 :(得分:2)

这就是ASP.NET MVC的美丽和作品。

没有“隐藏” - 这就是ASP.NET MVC处理URL的方式,并将这些“路由”映射到控制器类上的控制器操作。

远离“经典”ASP.NET Webforms的做事方式。

答案 3 :(得分:0)

在Apache + PHP下有两种方法可以做到这一点,但基本原则是制作一组URI(可能是所有URI,具体取决于您的网站,但您可能需要不同的脚本来处理不同的部分site)转换为单个PHP文件,告诉用户请求的对象。

概念上最简单的方法是将每个URL重写为一个脚本,该脚本通过$_SERVER['REQUEST_URI']获取URI并按其喜欢解释它。

URI重写可以使用各种方法完成,包括mod_rewrite,mod_alias和ErrorDocument(参见Apache文档)。

另一种方法是设置更复杂的URL重写(可能使用mod_rewrite)将路径添加为GET变量。

还有$_SERVER['PATH_INFO']变量,该变量加载了路径的不存在的部分。此选项几乎不需要修改Apache配置文件,但会略微降低URL的灵活性。

答案 4 :(得分:0)

现代Web开发框架支持优雅网址。查看DjangoRuby on Rails

答案 5 :(得分:0)

如果你正在使用Apache而你只是想隐藏静态HTML文件的文件扩展名,你可以使用这个.htaccess代码:

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f       # if the requested URL is not a file that exists
RewriteCond %{REQUEST_FILENAME} !-d       # and it isn't a directory that exists either
RewriteCond %{REQUEST_FILENAME}\.html -f  # but when you put ".html" on the end it is a file that exists
RewriteRule ^(.+)$ $1\.html [QSA]         # then serve that file

</IfModule>

Apache mod_rewrite被称为“voodoo,但非常酷的伏都教”。

我在几个网站上使用的实际.htaccess代码就是这样,但不完全相同:

<IfModule mod_rewrite.c>
    RewriteEngine on

    #RewriteRule ^$ index.php [QSA]
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.+)$ $1\.php [QSA]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)$ index.php/$1 [QSA]

</IfModule>

这是一些更长但更易读的代码,可以在Zeus服务器上执行相同的操作。在Zeus上,它被称为rewrite.script

# http://drupal.org/node/46508


# get the document root
map path into SCRATCH:DOCROOT from /
# initialize our variables
set SCRATCH:ORIG_URL = %{URL}
set SCRATCH:REQUEST_URI = %{URL}

match URL into $ with ^(.*)\?(.*)$
if matched then
  set SCRATCH:REQUEST_URI = $1
  set SCRATCH:QUERY_STRING = $2
endif

# prepare to search for file, rewrite if its not found
set SCRATCH:REQUEST_FILENAME = %{SCRATCH:DOCROOT}
set SCRATCH:REQUEST_FILENAME . %{SCRATCH:REQUEST_URI}

# check to see if the file requested is an actual file or
# a directory with possibly an index.  don't rewrite if so
look for file at %{SCRATCH:REQUEST_FILENAME}
if not exists then
  look for dir at %{SCRATCH:REQUEST_FILENAME}
  if not exists then
    look for file at  %{SCRATCH:REQUEST_FILENAME}.php
    if exists then
        set URL = %{SCRATCH:REQUEST_URI}.php?%{SCRATCH:QUERY_STRING}
    else
        set URL = /index.php/%{SCRATCH:REQUEST_URI}?%{SCRATCH:QUERY_STRING}
    endif
  endif
endif
goto END