2011-06-29 79 views
1

我有一個使用.htaccess進行URL路由的CI應用程序。我的基本設置如下:問題將CodeIgniter URL重定向到WWW

RewriteRule ^$ /var/www/html/ferdy/jungledragon/index.php [L] 
RewriteCond $1 !^(index\.php|images|img|css|js|swf|type|themes|robots\.txt|favicon\.ico|sitemap\.xml) 
RewriteRule ^(.*)$ /var/www/html/ferdy/jungledragon/index.php/$1 [L] 

這些規則對CI應用程序來說非常標準。他們將所有的URL(例外列表中的除外)都重寫到index.php前端控制器。上面的代碼也會隱藏index.php,因爲它通常會顯示爲每個URL的一部分。

到目前爲止,這麼好。一切正常。現在,爲了搜索引擎優化,我想強制所有流量到www。所以,我伸出的規則如下:

Options +FollowSymlinks 
RewriteEngine on 

RewriteRule ^$ /var/www/html/ferdy/jungledragon/index.php [L] 
RewriteCond $1 !^(index\.php|images|img|css|js|swf|type|themes|robots\.txt|favicon\.ico|sitemap\.xml) 
RewriteRule ^(.*)$ /var/www/html/ferdy/jungledragon/index.php/$1 [L] 

rewritecond %{http_host} ^jungledragon.com [nc] 
rewriterule ^(.*)$ http://www.jungledragon.com/$1 [r=301,nc] 

這最後兩行重寫http://jungledragon.com/anything網址http://www.jungledragon.com/anything網址。這種作品,但它帶回了index.php部分:http://jungledragon.com/anything變成http://www.jungledragon.com/index.php/anything

我究竟如何組合這些規則,以便它們不會相互干擾?我嘗試在CI規則之前進行WWW重寫。這顯示了一個錯誤的Apache 301頁面,而不是做實際的重定向。

此外,我還想包括規則來擺脫尾部斜槓,但現在讓我們保持簡單的問題。請注意,我在這裏和其他地方找到了有用的帖子,但由於某些原因,我仍無法找到適合我的情況的正確語法。

編輯:感謝您的幫助。此作品:

Options +FollowSymlinks 
RewriteEngine on 

rewritecond %{http_host} ^jungledragon.com [nc] 
rewriterule ^(.*)$ http://www.jungledragon.com/$1 [r=301,nc,L] 

RewriteRule ^$ /var/www/html/ferdy/jungledragon/index.php [L] 
RewriteCond $1 !^(index\.php|images|img|css|js|swf|type|themes|robots\.txt|favicon\.ico|sitemap\.xml) 
RewriteRule ^(.*)$ /var/www/html/ferdy/jungledragon/index.php/$1 [L] 

回答

2

mod_rewrite以線性方式處理規則。首先處理文件頂部的規則。

規則末尾的[nc][L]是如何處理規則的選項。

  • NC - NOCASE:情況insensative
  • L - 最後:在執行最後一條規則(如果你打這個,停止處理)

你需要把你的www redirect規則在您的CI規則之上,因此它將首先添加www,然後將CI規則應用於新重寫的URL。 **還可以使用CN標誌與您的www redirect規則,以便解析下一條規則。

http://mysite.com/blah ==變得==>http://www.mysite.com/blah ==變得==>http://www.mysite.com/index.php/blah(執行,而不是重定向)

發生了什麼事目前是:

http://mysite.com/blah ==變得==>http://mysite.com/index.php/blah( STOP)

瀏覽器轉到http://mysite.com/index.php/blah,並且自您的異常停止/索引以來第二次重新寫入通過完成。被處理

http://mysite.com/index.php/blah == PHP網址變成==>http://www.mysite.com/index.php/blah(改向)


的建議,這裏是mod_rewrite's documentation一個鏈接,如果你想進一步看看。

@LazyOne:Brainfart,對不起。

下面是從文檔概述你可能需要標誌的摘錄:

「鏈| C」(鏈接與下一條規則) 這個標誌鏈下一個規則當前規則(其本身可以與以下規則鏈接,等等)。這具有以下效果:如果規則匹配,則處理繼續照常 - 標誌不起作用。如果規則不匹配,則跳過所有後續鏈接規則。例如,它可以用來刪除.www'' part, inside a per-directory rule set, when you let an external redirect happen (where the.www''部分不應該發生的!)。

'next | N'(next round) 重新運行重寫過程(從第一個重寫規則開始)。這一次,匹配的URL不再是原始URL,而是最後一次重寫規則返回的URL。這對應於Perl下一個命令或C中的continue命令。使用此標誌重新開始重寫過程 - 立即轉到循環的頂部。 小心不要造成無限循環!

'NOCASE | NC'(任何情況下) 這使得模式不區分大小寫,當Pattern與當前URL匹配忽略 'A-Z' 和 'A-Z' 之間的差別。 'noescape | NE'(沒有輸出的URI轉義) 該標誌防止mod_rewrite將通常的URI轉義規則應用於重寫的結果。通常,特殊字符(例如'%','$',';'等)將被轉換爲它們的十六進制等同字符(分別爲'%25','%24'和'%3B')。這個標誌防止這種情況發生。這允許百分比符號出現在輸出中,如

+0

OP規則中沒有[C]標誌,只有[NC]。你也可以發佈一個鏈接到Apache的mor_rewrite手冊,這樣OP可以學習更多的自己。 – LazyOne

+0

對不起,沒有迴應,我在工作,但今晚會嘗試這個。 – Ferdy

+0

+1完美。謝謝 – brenjt