2012-12-03 63 views
0

我的任務是讓一箇舊網站的網址「漂亮」如何使用數據庫值更改舊php網站上的URL結構?

這是一個房地產網站,有幾十個建築物,可能100個總公寓列表。

當前網址是這樣的:(我是能夠與.htaccess輕鬆去除.php擴展)

example.com/about?building-id=65 
example.com/about?apartment-id=35 

它變得相當複雜多了,有一些搜索的頁面,不同的列表視圖,一個接觸的形式頁面被髮送的建築物或公寓ID號來prefil一些信息等形式......

但對於這個例子...

理想的網址應

example.com/about/building-name/ 
example.com/about/building-name/apartment-name 

建築物名稱和公寓名稱都是存儲在數據庫中的值,以id#s作爲主鍵。

研究這個問題有點後,我已經確定了幾個不同的方法

1)動態生成後的變化.htaccess文件管理

  • 我想我能做到這一點嗎?
  • 它會明確重寫幾乎每個可能的有效查詢字符串的可能性(可能高達幾百)
  • 我想這會導致一些性能問題,可能不是最佳實踐。
  • 如果它是最簡單的選擇,只要它有效,我認爲它是草率和糟糕的做法。

2)創建控制器和rewite所有查詢index.php這將放在一起從這裏各方面的意見。

  • 這是多一點我的舒適區,但可能被認爲是最佳做法?

該網站是嚴重的時候,並把不良在一起對於這個問題,它真的2個不同的地點共享一個數據庫,並且大多數(有很多重複的代碼定製(非OOP)的PHP的行1000) (第2次被創造前一段時間與原來的代碼基礎的複製粘貼,並從此分道揚鑣)代碼庫


我的問題(一個或多個)

  • 這些可行的選擇,我錯過了任何選擇?

  • 我應該採取哪種方法?

+0

與id一個例子可以幫助:'example.com/about/building-name/apartment-name '這個例子中的id在哪裏,或者是同一個名字? –

+0

ID是數字,但名稱是一個字符串。這些名稱將映射到ID爲數據庫的ID作爲主鍵。所以......「about?apartment-id = 4324」必須查找帶有該ID的公寓,找到它的名字和相關的建築物ID。然後它會從* that * id中獲取建築物名稱,並像這樣構建網址:'about/building-name/apartment-name' –

+0

這些名稱是否是唯一的? –

回答

1

實際生成.htaccess文件不會是一個問題。我的意思是,將500或1000行文本寫入文件並不是什麼大不了的。但是,大量規則實際上可能會給性能造成很大影響,因爲引擎會根據每個HTTP請求檢查所請求的URL。這可能不是一個非常大的表現,但對我來說似乎很浪費。請注意,Apache,AFAIK沒有對.htaccess重寫規則或重定向進行優化,也就是說,它不會從小的正則表達式中構建一個大的正則表達式,等等。

選項2在PHP中解析請求實際上更少工作,我認爲,尤其是在一個龐大的非OOP網站上。

考慮這樣一個片段:

$uri = explode('/', $_SERVER['REQUEST_URI']); 
if($uri[0] == 'about') { 
    $id_aray = lookup_building_and_apartment_by_name($uri[1], $uri[2]); 
    $_GET['building_id'] = $id_array['building']; 
    $_GET['apartment_id'] = $id_array['apartment']; 
    include('about.php'); 
} 
else if($uri[0] == 'something_else') { 
    // something else. 
} 
else { 
    // 404 
} 

這樣的邏輯將成爲非常清楚作爲控制器,它是沒有這麼大的工作。

交替地,您可以在每個入口點的頂部放置一個URI分析器片段。就像在about.php的頂部:

$uri = explode('/', $_SERVER['REQUEST_URI']); 
$id_aray = lookup_building_and_apartment_by_name($uri[1], $uri[2]); 
$_GET['building_id'] = $id_array['building']; 
$_GET['apartment_id'] = $id_array['apartment']; 

這將使您能夠逐步工作,一子頁面的時間,和舊的鏈接會繼續正常工作。


晴備案:有一個選項3,您可以在mod_rewrite的規則中使用capture groups,就像這樣:

RewriteRule ^/about/([^/]+)/([^/]+)$ about.php?building_name=$1&apt_name=$2 [NC,L] 
RewriteRule ^/about/([^/]+)$ about.php?building_name=$1 [NC,L] 

(這可以用一個規則來執行,但它是相當容易閱讀&這樣寫)。這仍然需要你在about.php中有一個基於php的翻譯,但有一個好處,你可以把這些規則放在你的httpd.conf中。

還有一個選項4:RewriteMap。這是一個非常棒的強大工具,如果你能夠處理Apache手冊的簡潔性,它可能只是你的事情。學習使用它可能會比使用基於PHP的解決方案花費更多的時間,但是知道這是一件好事,它是一種高效的解決方案,而且非常優雅。

你可以很容易地生成一個text-based mapping,然後使用映射在重寫規則,就像這樣:

RewriteMap building_map txt:/etc/apache2/buildings.txt 
RewriteRule ^/about/([^/]+)$ about.php?building-id=${building_map:$1|0} [NC,L] 
+0

謝謝,這*確實顯得比我懷疑的更簡單。我會去實施這個(可能明天)。如果我卡住了,我會發表另一條評論。 –

+1

不客氣。我增加了兩個選項,如果你想學習奇妙的東西,你可能想看看RewriteMap。此外,我現在認爲我搞砸了爆炸REQUEST_URI的索引(我猜REQUEST_URI以斜槓開始,所以第0個元素是一個空字符串)。 –

+0

'RewriteMap'看起來很棒。不幸的是,它不能在'.htaccess'中運行,並且這個站點在共享主機上,而不能訪問'htppd.conf'。 –