2013-04-02 36 views
2

我意識到這個問題已經被很多人的要求毆打致死,但大多數答案似乎只適合一個非常具體的情況,只適合他們的需求,到目前爲止我還沒有找到合適的解決方案(至少據我所見)。使用rewritemap和mysql重寫url參數

我的問題是,我試圖讓我的網站從一個ID重定向URL參數到一個實際的字符串。

例如:

www.example.com/?category=1 

將顯示爲:

www.example.com/software 

www.example.com/?category=2 

將顯示爲:

www.example.com/software/desktop 

從我讀過的,我應該看看一個Apache重寫映射,這是我的困惑進來的地方。我真的寧願不必從平坦的txt文件加載,因爲我會喜歡使它儘可能動態,並且我已經讀過,我可以使它從一個PHP文件中讀取並從MySQL數據庫中讀取,這正是我想要的。

問題是我真的不太確定實現這個的正確方法。 RewriteMap文檔僅僅涵蓋了平坦的.txt文件,並沒有用MySQL來實現。

所以基本上我問的是如果有人可以解釋如何實現我正在尋找的東西,或者至少指向正確的方向。到目前爲止,我發現的大多數線程可悲的是沒有太多幫助,但可能我可能會通過有用的線程。

如果有幫助,現在,我的MySQL數據是在繼承結構進行格式化,像這樣:

ID | Title   | Link    | Parent 
    1 | Software   | /Software/   | NULL 
    2 | Desktop Software | /Software/Desktop/ | 1 
    2 | Mobile Software | /Software/Mobile/ | 2 

PS: 我要補充一點,大多數的解決方案,我發現這個給予的例子:

RewriteMap examplemap prg:/path/to/file.php 
    RewriteRule (.*) ${examplemap:$1} 

但它永遠不會提供有關file.php中的內容以及它如何查詢和返回值的信息。

編輯 我要指出,我是一個共享的主機服務器上,而不是我自己的私單,所以我可能不會獲得所有可能的選項

EDIT 2 貪圖清晰度: 我想要做的是讓訪問「example.com/software」的用戶將被視爲處於「example.com/?category=1」上;基本上非常漂亮的鏈接,並使其更具可讀性。唯一的一點是,我試圖從數據庫中讀取它

+0

+1,用於清晰和完善地解釋手頭的問題。 –

回答

1

如果您無權訪問服務器或vhost配置,則無論如何您都不能使用RewriteMap。映射本身需要在服務器或vhost配置中定義,而不是在htaccess文件中定義。但是apache 2.4可以使用mod_dbd來使用SQL query to define a rewrite map

如果你需要訪問MySQL,你最好在PHP中完成所有這些工作,而不是使用mod_rewrite。你會使用mod_rewrite路由到你的php文件,然後重定向。也許這樣?

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /file.php?link=$1 [L] 

所以,當有人請求http://example.com/Software/Mobile/,該請求被改寫爲:/file.php?link=Software/Mobile/,和你的file.php腳本會做的查找。

或者,如果你實際上意味着周圍的其他方法:

RewriteCond %{QUERY_STRING} category=([0-9]+) 
RewriteRule ^$ /file.php?ID=%1 [L] 

所以,當有人請求http://example.com/?category=2,該請求被改寫爲:/file.php?ID=2和PHP腳本執行查找。

+0

感謝您的迴應!我會澄清我在尋找更好的東西; 我希望它可以讓訪問example.com/software的人在內部解析爲example.com/?category=1;基本上'漂亮'的鏈接。隨着你發佈的內容,它會被使用像:RewriteCond%{「SELECT鏈接從類別WHERE id =%s」}?還是我理解它很奇怪? 編輯:另外,file.php將如何做查找?它是否必須返回一個值? – Bitwize

+0

無視我上面的帖子,我明白你現在在說什麼(我認爲我當時只是在製作)。完善!感謝人 – Bitwize

+0

有沒有什麼辦法可以保證,當鏈接被作爲參數傳遞時,有一個尾部的斜線?因爲「軟件/桌面」與查詢中的「軟件/桌面/」不同。那只是在$ __ GET ['link']後面加上一個PHP腳本?還是有一個Apache的方式來做到這一點? – Bitwize

0

我的建議是看看利用前端控制器模式。我認爲,一旦開始使用用戶友好的URL或「路由」的概念,前端控制器可以簡單地做到這一點,因爲您無需擔心在Web服務器級別將特定的URL映射到特定的控制器。

如果已經啓用了Apache的mod_dir(沒準你這樣做),你可以做這樣的事情在你的Apache配置或.htaccess

FallbackResource /index.php 

這個簡單的指令將直接否則會導致一個404的任何請求錯誤發送到前端控制器/index.php

這也可以通過mod_rewrite就像這樣:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php [L,QSA] 

在前端控制器,你可以評估的URI和請求路由到任何邏輯需要處理請求。你可以通過從數據庫或硬編碼路由或任何其他路徑查找路由來做到這一點。 (不過我會建議,如果使用數據庫,你可以使用快速訪問的路由版本)。

有許多不同的PHP路由控制器可用,您不需要重新發明輪子(大多數每個現代框架都有某種路由概念)。

+0

我不確定這是否是我想去的方法。我只是做了一些閱讀,如果重寫規則沒有匹配,它看起來主要是後備。我給出的上述數據庫只是網站所有部分的一小部分,爲簡化說明,我簡化了它。這就是我重寫URL參數的原因。儘管謝謝你的回答! (如果我對我的理解錯了,請隨時糾正我) – Bitwize

+0

@Bitwize你也可以利用mod_rewrite建立一個前端控制器(事實上,你通常看不到它)。我已經更新了答案來展示這種方法。我傾向於使用FallbackResource路由到前端控制器,但使用重寫規則來實際重寫/重定向URL,無論出於何種原因,我都需要對其進行更改。如果您有許多路由可能正在編寫特定的重寫規則,那麼這可能是遷移到前端控制器的更多原因,因爲它只能處理應用級別的路由邏輯,因此更易於維護。 –