2009-11-18 47 views
2

我想隱藏頁面擴展,如stackoverflow呢。以下工作如何?隱藏頁面擴展(像StackOverflow)

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

我已經看到了很多做這個網站,但我還是不知道這是怎麼實現的(我有一個LAMP堆棧)。

回答

6

當一個Web服務器獲取一個URL的請求時,它必須決定如何處理它。傳統的方法是將URL的頭部映射到文件系統中的目錄,然後讓URL的其餘部分導航到文件系統中的文件。因此,URL有文件擴展名。

但是沒有必要這樣做,大多數新的web框架都不需要。他們讓程序員定義如何將URL映射到代碼運行,所以不需要文件擴展名,因爲沒有單個文件提供響應。

在你的例子中,沒有包含文件「foo」和「bar」的「tags」目錄。 「標籤」URL被映射到代碼中,該代碼使用URL的其餘部分(「foo」或「bar」)作爲針對標籤數據數據庫的查詢中的參數。

+0

感謝您的解釋。 – sels520

3

你想要的是乾淨的URL,你可以用apache和.htaccess來完成。有可能是一個更好的辦法,但在這裏是如何我已經做了:

http://evolt.org/Making_clean_URLs_with_Apache_and_PHP

+3

澄清 - StackOverflow不「隱藏擴展」,它使用MVC來定義路徑,它對應於視圖。 –

+0

它們通常對應於控制器方法,但其中許多具有相同命名的視圖。 – JasonTrue

2

這就是美麗和ASP.NET MVC工作。

沒有「隱藏」 - 它只是ASP.NET MVC處理URL的方式,並將這些「路由」映射到控制器類上的控制器操作。

離「經典」的ASP.NET Webforms做事方式有了很大的進步。

+1

我期待着ASP.NET 4.0中的Web表單 –

0

在Apache + PHP下有幾種方法可以做到這一點,但其基本原則是製作一組URI(可能是所有的URI,取決於您的站點,但您可能需要不同的腳本來處理不同的部分)該網站)翻譯成一個PHP文件,該文件被告知用戶請求了什麼對象。

概念上最簡單的方法是將每個網址重寫爲一個腳本,該腳本通過$_SERVER['REQUEST_URI']獲取URI並解釋它的喜好。

URI重寫可以使用各種方法完成,包括mod_rewrite,mod_alias和ErrorDocument(請參閱Apache文檔)。

另一種方法是設置更復雜的URL重寫(可能使用mod_rewrite)將路徑添加爲GET變量。

還有$_SERVER['PATH_INFO']變量,它加載了不存在的部分路徑。這個選項需要對Apache配置文件進行很少修改或不需要修改,但會稍微降低URL的靈活性。

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> 

阿帕奇mod_rewrite被稱爲「巫毒教,但嚴重涼爽巫術」 。

實際.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服務器上同樣的事情。在宙斯,它叫做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