我想隱藏頁面擴展,如stackoverflow呢。以下工作如何?隱藏頁面擴展(像StackOverflow)
http://stackoverflow.com/tags/foo
http://stackoverflow.com/tags/bar
我已經看到了很多做這個網站,但我還是不知道這是怎麼實現的(我有一個LAMP堆棧)。
我想隱藏頁面擴展,如stackoverflow呢。以下工作如何?隱藏頁面擴展(像StackOverflow)
http://stackoverflow.com/tags/foo
http://stackoverflow.com/tags/bar
我已經看到了很多做這個網站,但我還是不知道這是怎麼實現的(我有一個LAMP堆棧)。
當一個Web服務器獲取一個URL的請求時,它必須決定如何處理它。傳統的方法是將URL的頭部映射到文件系統中的目錄,然後讓URL的其餘部分導航到文件系統中的文件。因此,URL有文件擴展名。
但是沒有必要這樣做,大多數新的web框架都不需要。他們讓程序員定義如何將URL映射到代碼運行,所以不需要文件擴展名,因爲沒有單個文件提供響應。
在你的例子中,沒有包含文件「foo」和「bar」的「tags」目錄。 「標籤」URL被映射到代碼中,該代碼使用URL的其餘部分(「foo」或「bar」)作爲針對標籤數據數據庫的查詢中的參數。
你想要的是乾淨的URL,你可以用apache和.htaccess來完成。有可能是一個更好的辦法,但在這裏是如何我已經做了:
澄清 - StackOverflow不「隱藏擴展」,它使用MVC來定義路徑,它對應於視圖。 –
它們通常對應於控制器方法,但其中許多具有相同命名的視圖。 – JasonTrue
這就是美麗和ASP.NET MVC工作。
沒有「隱藏」 - 它只是ASP.NET MVC處理URL的方式,並將這些「路由」映射到控制器類上的控制器操作。
離「經典」的ASP.NET Webforms做事方式有了很大的進步。
我期待着ASP.NET 4.0中的Web表單 –
在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的靈活性。
現代Web開發框架支持優雅的網址。檢查出Django或Ruby on Rails。
如果你使用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
感謝您的解釋。 – sels520