2010-12-15 20 views
1

StackOverflow有一個非常整齊,乾淨的URL格式。它看起來與目錄結構相同,但是這裏不能有每個問題的目錄!我的問題是這樣的:

例如,我怎樣才能得到http://www.site.com/sections/tutorials/tutorial1,就像在地址欄中那樣,但是將它轉換爲$_GET請求讓PHP弄亂?

我可以使用.htaccess文件,但我不希望URL被重寫 - 我希望它保持乾淨和友好。我唯一的選擇是使用PHP的字符串分割函數來獲取一些假裝的$_GET數據嗎?

感謝,

詹姆斯

+0

除非您重定向,否則'.htaccess'的'ModRewrite'只會重寫服務器端的URL。客戶端,用戶保持乾淨的URL。 – Eric 2010-12-17 12:06:39

回答

1

怎麼樣,使用.htaccess來分割URL,URL不會改變,而是指向index.php各種$_GET變量,這可能會增加以覆蓋更多的URL部分。

# turn rewriting on 
RewriteEngine on 

# get variables in this order, [object], [object,action], [object,action,selection] 
RewriteRule ^([^/\.]+)/?$ /index.php?object=$1 [L,NC,QSA] 
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ /index.php?object=$1&action=$2 [L,NC,QSA] 
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ /index.php?object=$1&action=$2&selection=$3 [L,NC,QSA] 
+0

我說得很對''.htaccess'權利? – Bojangles 2010-12-15 16:48:53

+0

@JamWaffles:是的 – Eric 2010-12-17 12:07:39

0

一個PHP REST框架能爲你做到這一點,所以我是指你這個question。大多數框架不會加載$_GET的數據,但會提供一個類似的,同樣便捷的方式來閱讀它。

+0

感謝您的推薦,但我寧願不使用框架 - 我只想要我的OP中概述的一個功能,所以一個框架將是矯枉過正的。當談到開發我的網站的其他部分時(相當長一段時間),我可能會考慮一個:-) – Bojangles 2010-12-15 16:44:21

0

如果您不想使用mod重寫,最好的解決方案是使用正則表達式再次使用$_SERVER['REQUEST_URI']變量。

即:

preg_match('|/(.*)/(.*)|', $_SERVER['REQUEST_URI'], $match); 
$_GET['param1'] = $match[1]; 
$_GET['param2'] = $match[2]; 

如果你想建立一個捕獲所有的PHP腳本。即如果腳本請求不存在使用默認腳本,使用國防部重寫一切重定向到一個腳本,即Zend框架(和大多數PHP MVC框架)使用此:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 
RewriteRule ^.*$ index.php [NC,L] 

我認爲,可能有點麻煩。

+0

謝謝你的mod_rewrite的想法 - 我完全忘了這一點。但是,我需要編輯apache配置文件嗎?我無法訪問我的文件系統,很容易... – Bojangles 2010-12-15 09:30:38

+0

@JamWaffles:如果你想做一個捕獲所有的PHP腳本只是使用國防部重寫 – RageZ 2010-12-15 09:32:29

0

它實際上是一個建立你的URI的RESTful方式。不僅SO應用這種模式。我建議不要通過查看this問題來重新發明輪子。

此外,您可以切換到默認配置爲使用RESTful模式的REST風格框架,如CakePHPCodeIgniter

0

$_GET不包含URL中的路徑組件,只包含最終遵循?的參數。你可以使用

$parts = explode('/', pathinfo($_SERVER['REQUEST_URI'], PATHINFO_DIRNAME)); 
var_dump($parts); 

然而,看起來你應該閱讀URL重寫例如與mod_rewrite。 「我不希望URL被重寫 - 我希望它保持乾淨和友好」......重寫發生在服務器上。用戶永遠不會看到「醜陋」的結果。