2010-11-22 71 views
2

我吸在重寫規則,所以..可惜我> _>組合兩個mod_rewrite的規則

我想這兩個規則一起工作..基本上我想刪除它時所使用的www,然後把所有請求帶有GET變量的index.php,如果域名在域名之後..

例如:www.example.com和www.example.com/foo將分別轉到example.com和example.com/foo。

繼承人我有什麼合併:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{HTTP_HOST} ^www.example.com$ [NC] 
    RewriteRule ^(.*)$ http://example.com/$1 [R=301,L] 
    RewriteCond  %{REQUEST_FILENAME}  !-d 
    RewriteCond  %{REQUEST_FILENAME}  !-f 
    RewriteRule  (.*) index.php?token=$1 [QSA,L] 
</IfModule> 

我還沒有這樣測試這個我唐諾..但我很懷疑我是不是正確的。

編輯:爲了澄清,我不是故意說需要成爲一個規則,但他們會按預期一起工作嗎?

+0

我不明白。這不正常嗎?爲什麼它需要成爲1規則? – 2010-11-22 21:58:29

+0

無需合併。如果條件沒有失敗,301會發生,然後它將被跳過,第二條規則將被踢出。 – Stephen 2010-11-22 21:59:04

回答

3

這應該是確定的,因爲您的第一條規則標記爲[L] Last和[R]重定向 - 因此兩個規則不必同時處理。第一個將處理,重定向,清除第一個,然後是第二個進程。

您可以使用[C]將條件鏈接在一起 - 這意味着如果第一個通過,則會嘗試下一個條件,但如果第一個失敗,則會跳過所有鏈接的後繼。我不認爲這就是你想要的。如果有的話,你會想要一個[OR]指令。

你重寫看起來體面,除了可能的,去年一個,其中 - 如果你正在使用這一個笨網站 - 通常樣子:

RewriteRule ^(.*)$ index.php?/$1 [L] 

作爲最佳實踐,您應該在test-subdomain.example.com上設置一個重複的網站,以便儘可能在實時環境附近擺弄這樣的事情。

您的意見:如果你想通配符域,只是:

RewriteCond %{HTTP_HOST} ^www\.[^.]+\.com$ [NC] 
RewriteRule ^[^.]+.([^.]+).com/(.*)$ http://$1.com/$2 [R=301,L] 
0

通常情況下,一個複雜的網站可以在.htaccess文件中有數百條規則,每個規則都有自己的一組RewriteCond。沒有必要將它們合併成一個包羅萬象的規則。