2012-03-16 126 views
2


我試圖重寫URL如下:的mod_rewrite不工作,因爲它應該

  • www.example.com/module-name(/)=> handler.php模塊=模塊名稱?
  • www.example.com/module-name/list/of/arguments(/)=> handler.php?module = module-name & args = list/of/arguments(我在後面的腳本中展開)

如果模塊名缺失或不被允許,它將加載網站的主頁。這裏沒有問題。
問題是mod_rewrite不能正常工作。我寫這些重寫規則...

RewriteEngine On 

RewriteRule ^([^/]*)/?$  handler.php?module=$1 
RewriteRule ^([^/]+)/(.+)/?$ handler.php?module=$1&args=$2 

...但強似模塊名作爲模塊處理程序,重寫引擎通過腳本本身的名稱,handler.php。我在過去兩天嘗試了不同的正則表達式,但結果總是相同的。我不知道該做什麼了!

重寫規則位於.htaccess中,位於文檔根目錄(與handler.php一起)中,並且我在Ubuntu 11.10 64位機器上運行xampp。

在此先感謝!

回答

3

是的,發生重寫之後,它進入下一個週期,而不是如你所願,立即現有的。

您需要修改您的規則(或添加單獨的條件)以忽略對handler.php文件的請求。例如:

RewriteRule ^(?!handler\.php)([^/]*)/?$ handler.php?module=$1 [L] 
RewriteRule ^(?!handler\.php)([^/]+)/(.+)/?$ handler.php?module=$1&args=$2 [L] 

或有額外的單獨的條件:

RewriteCond %{REQUEST_URI} !/handler\.php$ 
RewriteRule ^([^/]*)/?$ handler.php?module=$1 [L] 

RewriteCond %{REQUEST_URI} !/handler\.php$ 
RewriteRule ^([^/]+)/(.+)/?$ handler.php?module=$1&args=$2 [L] 

,甚至這樣的:

# do not touch requests to handler.php 
RewriteRule ^handler\.php$ - [L] 

# our rewrite rules 
RewriteRule ^([^/]*)/?$ handler.php?module=$1 [L] 
RewriteRule ^([^/]+)/(.+)/?$ handler.php?module=$1&args=$2 [L] 

您還可以走得這樣(這真的取決於你重寫邏輯)

# do not do anything for requests to existing files 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule .+ - [L] 

# our rewrite rules 
RewriteRule ^([^/]*)/?$ handler.php?module=$1 [L] 
RewriteRule ^([^/]+)/(.+)/?$ handler.php?module=$1&args=$2 [L] 
+0

哇,非常感謝您的快速和詳細的答案,現在它就像一個魅力! – Francesco 2012-03-16 15:34:59

+0

@Ceppo很高興爲你效勞。現在請選擇其中一個答案並將其標記爲已接受,thnx – LazyOne 2012-03-16 18:49:52

+0

完成。對不起,我以前沒有用過StackOverflow :) – Francesco 2012-03-17 11:12:14

1

一個問題可能是現有的文件名也會被重寫。爲了避免這種情況,你可以添加:所以你

RewriteCond %{REQUEST_FILENAME} !-f # ignore existing files 
RewriteCond %{REQUEST_FILENAME} !-d # ignore existing directories 

這將是:

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-f # ignore existing files 
RewriteCond %{REQUEST_FILENAME} !-d # ignore existing directories 
RewriteRule ^([^/]*)/?$  handler.php?module=$1 

RewriteCond %{REQUEST_FILENAME} !-f # ignore existing files 
RewriteCond %{REQUEST_FILENAME} !-d # ignore existing directories 
RewriteRule ^([^/]+)/(.+)/?$ handler.php?module=$1&args=$2 
+0

也謝謝你的支持swer! – Francesco 2012-03-16 15:35:18

相關問題