2011-06-29 110 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