2012-05-18 45 views
0

我使用MVC與/ <模塊>/<控制器>/<動作命名模塊> /必須在example.com/module/whatever一個模塊,我需要「重新命名'它爲example.com/module-a/whatever。整個應用程序已經寫好了,所以我不能在我的代碼中進行更改,所以我希望能夠使用mod_rewrite來完成。我試過以下如何在URL與mod_rewrite的

RewriteCond %{THE_REQUEST} ^GET\ /module/ 
RewriteRule ^module/(.*) /module-a/$1 [L,R=301] 

它做了什麼,我想盡可能重定向所有URL像example.com/module/whatever到example.com/module-a/whatever,但現在我需要的所有請求'module-a'被內部改寫爲'module'。它還需要爲模塊根目錄(即不帶結尾斜槓的example.com/module)。這可能嗎?我加

RewriteRule ^module-a/(.*)$ module/$1 

直接在上述條件和規則,但在訪問頁面時,還在說模塊「模塊,一個」沒有找到之下。


編輯:

我有低於幾個規則,我不認爲他們會影響到這一點,但在這裏,他們無論如何是:

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

解決方案

我結束了使用

RewriteCond %{THE_REQUEST} ^GET\ /module/ 
RewriteRule ^module$ /module-a [L,R=301] 
RewriteRule ^module/(.*) /module-a/$1 [L,R=301] 

將所有鏈接從模塊重定向到模塊-a。我必須用2條規則來做,因爲我不知道正則表達式是否足以將它們結合起來,從而處理url example.com/module的特例。

要在內部改寫,原來的規則,我不得不通常會工作,但Zend公司似乎做一些東西,將覆蓋,所以我有途徑來處理它。見rename a zend module with routes

回答

0

如果我理解正確的話,那麼你已經從錯誤的方向走了這一點。我也對你的RewriteCond的目的不明確

你希望所有的模塊-A/*請求被內部處理的模塊/ *,因此,所有你需要的是一個簡單的重寫::

重寫規則^模塊-a /?((*))/ module/$ 1 [L]

我懷疑你現在遇到的問題是網站上的所有reference/module /而不是/ module-a /的內部鏈接,但是把301不會導致問題的結束(尤其是對於搜索引擎),隨後的重寫可能會成爲循環引用。您是關在您的應用程序改變代碼的鏈接更好(如果你有一個鏈接的抽象類),或在最壞的情況使用輸出緩衝渲染頁面之前交換的各個環節進行。

注意:如果所述第一匹配時,爲[L]導致的mod_rewrite如果規則匹配停止處理未被處理小於上述第二條規則。

+0

的的RewriteCond使得只有當原來的請求是對/模塊的應用,所以它沒有做任何的循環。並且代替代碼中的每個事件都不是一種選擇。我想我確實希望第一條規則中的[L],因爲我希望它爲第二條規則提出新的申請。搜索引擎並不是我的特例。 – rwilson04