2011-08-21 72 views
2

使用mod_rewrite,什麼RewriteRule(s)會使以下兩個示例正常工作?用等號分隔的URL項重寫爲查詢字符串

實施例#1(一個術語):

http://example.net/dir/thanks 
-to- 
http://example.net/dir/index.php?a=thanks 

實施例#2(兩個術語):

http://example.net/dir/thanks=stackoverflow 
-to- 
http://example.net/dir/index.php?a=thanks&b=stackoverflow 

注: .htaccess文件位於域根目錄的/ dir /之外。

我已經得到接近與此:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]*)=([^/]*)/?$ index.php?a=$1&b=$2 [L] 

然而,與實施例#1尾部的 「=」 是必需的(我想避免)工作。我試過將「=」改爲「=?」在正則表達式使其可選,但它然後工作例如#1它失敗,例如#2。

謝謝你對我的問題的任何考慮。我是mod_rewrite和正則表達式的新手,真的很難過。

回答

1

的我看到兩個主要的方法:

1.更安全/更容易理解,如果需要延伸。 讓兩個規則:1將趕上thanks=stackoverflow而第二個將只thanks工作:

RewriteEngine On 

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

# will work with /thanks=stackoverflow 
RewriteRule ^([^/=]+)=([^/=]+)/?$ index.php?a=$1&b=$2 [L] 
# will work with /thanks 
RewriteRule ^([^/=]+)/?$ index.php?a=$1 [L] 

將這兩個規則合併爲一個規則。在這種情況下參數b=將始終存在,但將是空的thanks場景:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/=]+)(=([^/=]+))?/?$ index.php?a=$1&b=$3 [L] 

測試了 - 在我的Apache盒做工精細。

+0

謝謝!你的兩個例子在這裏也很棒。我真的很感激詳細的解決方案;他們幫助我提高了對mod_rewrite的理解。在我的問題投擲飛鏢幾小時後,我現在看到我要去哪裏錯了,謝謝你的回答。 – kiteman

0

爲什麼不創建兩個單獨重寫規則:

i)一種是採用實例1的護理 - 與添加的檢查,它不包含等號[讓你不重寫匹配例如2規則1]

ⅱ)另一個負責實施例2

+0

感謝您對解決方案有幫助的洞察力。我接受了LazyOne的答案,因爲它包含了工作代碼,但您最初幫助我引導了正確的方向。 – kiteman