2012-03-30 96 views
0

這是我的原則:Mod重寫?被列入

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^domain.com 
RewriteRule ^index\.php?(.*)$ http://www.domain.com/$1 [R=301,L] 

我輸入網址爲http://domain.com/test,但是當我想到http://www.domain.com/test瀏覽器重定向到http://www.domain.com/?/testTested here

這個想法是重定向到www.,但問題是我正在使用自定義框架,它重寫到index.php?$1

+0

您好! (更新後的)答案是否有意義? – larsks 2012-04-04 00:32:30

+0

我只是剛剛看到您的更新,對不起。我會測試它並回復你。乾杯。 – Prisoner 2012-04-04 09:57:45

回答

1

請參閱UPDATE,如下。

你的問題可能是?是正則表達式元字符(如.*):

?表示零或先前表達式中的一個。 「pin?e」將匹配「鬆」和「派」。 source

嘗試逃脫這樣的:

RewriteRule ^index\.php\?(.*)$ http://www.domain.com/$1 [R=301,L] 

您現有的規則是尋找index.ph,可能還跟着p,然後收集所有剩餘的字符轉換爲$1(其中將包括?)。

UPDATE

經審查,我在這裏做了一些非常基本的錯誤。請允許我糾正它們:

mod_rewrite只查看URL的路徑部分...這意味着所有內容都是從查詢字符串中分離出來的,但不包括?。所以我上面列出的規則將永遠不會工作,因爲?和以下文本不被RewriteRule看到。

可以對陣查詢字符串與RewriteCond指令,這給了我們:

RewriteCond %{QUERY_STRING} (.*) 
RewriteRule ^/index.php http://www.domain.com/%1 [R=301,L] 

這轉儲的查詢字符串中的任何物體插入%1,然後將其追加到http://www.domain.com/ ...幾乎工作,但你會發現,這樣的懇求:

http://domain.com/index.php?some/path 

變爲:

http://www.domain.com/some/path?some/path 

我們需要包括?我們重寫路徑告訴mod_rewrite抹去的查詢字符串,這給了我們:

RewriteCond %{QUERY_STRING} (.*) 
RewriteRule ^/index.php http://www.domain.com/%1? [R=301,L] 

我的系統上使用此配置,請求:

http://localhost/index.php?some/path 

返回:

HTTP/1.1 301 Moved Permanently 
Date: Sat, 31 Mar 2012 00:39:34 GMT 
Server: Apache/2.4.1 (Unix) OpenSSL/1.0.0g-fips mod_macro/1.2.1 
Location: http://www.domain.com/some/path 
+0

我已經試過了,如果你去了包含的鏈接並使用你的重寫規則和url:'http://domain.com/index.php?/ test/a',它不會刪除/?正確。 – Prisoner 2012-03-30 23:02:26