2008-09-19 82 views
1

現在我在做這樣的事情:MOD-重寫:改變所有的URL

RewriteRule ^/?logout(/)?$ logout.php 
RewriteRule ^/?config(/)?$ config.php 

我寧願有一個規則,會做同樣的事情,每個網址,所以我不每次添加新文件時都不得不添加它們。

此外,如果可能,我喜歡將'/ config/new'與'config_new.php'匹配。我猜一些正則表達式會讓我做到這一點?

感謝Stack Addicts!

回答

2

嘗試:

重寫規則^ /(\ w +)/ $ $ 1.PHP

的$ 1括號內的第一捕獲字符串的內容?。第二斜線周圍的括號不需要。

編輯:對於另一場比賽中,試試這個:??

重寫規則^ /(\ w +)/(\ w +)/ $ $ 1_ $ 2.PHP

1

國防部重寫不能做(潛在的)無限的替換,就像你想在你的問題的第二部分所做的那樣。但在Apache URL Rewriting Guide底部檢查出外部重寫引擎:

外部重寫引擎

說明:

一個常見的問題:我們怎樣才能解決FOO/BAR/QUUX /等。問題?使用mod_rewrite似乎沒有解決方法... 解決方案:

使用外部RewriteMap,即像RewriteMap一樣工作的程序。它在Apache啓動時運行一次,在STDIN上收到請求的URL,並且必須將結果(通常是重寫的)URL放在STDOUT上(相同的順序!)。

RewriteEngine on 
RewriteMap quux-map  prg:/path/to/map.quux.pl 
RewriteRule ^/~quux/(.*)$ /~quux/${quux-map:$1} 

#!/path/to/perl 

# disable buffered I/O which would lead 
# to deadloops for the Apache server 
$| = 1; 

# read URLs one per line from stdin and 
# generate substitution URL on stdout 
while (<>) { 
    s|^foo/|bar/|; 
    print $_; 
} 

這是一個示範的,例如,只是重寫所有的URL /〜QUUX /富/ ...到/〜QUUX /酒吧/ ......其實你可以編寫任何你喜歡的。但請注意,雖然這樣的地圖也可以由普通用戶使用,但只有系統管理員才能定義它。

+0

哦,是的,我做了一次,以支持用戶名子域名;)很好玩。 – Aeon 2008-09-19 19:08:27

2

我會做這樣的事情:

RewriteRule ^/?(logout|config|foo)/?$ $1.php 
RewriteRule ^/?(logout|config|foo)/(new|edit|delete)$ $1_$2.php 

我更明確列出的URL我想匹配,所以,我不擔心靜態內容或以後增加新的東西,不需要重寫到php文件。

以上是確定的,如果所有子網址的適用於所有根的URL(book/newmovie/newuser/new),但不是那麼好,如果你想有不同的子網址取決於根動作(logout/new沒有多大意義)。您可以使用更復雜的正則表達式處理該問題,或者將所有內容都路由到單個php文件,該文件將根據url確定要包含和顯示的文件。