问题将CodeIgniter URL重定向到WWW

时间:2011-06-29 22:19:15

标签: codeigniter mod-rewrite url-rewriting

我有一个使用.htaccess进行URL路由的CI应用程序。我的基本设置如下:

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(除了例外列表中的URL)重写为index.php前端控制器。上面的行也隐藏了index.php,因为它通常会显示为每个URL的一部分。

到目前为止,这么好。一切正常。现在,为了SEO,我想强制所有流量到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]

1 个答案:

答案 0 :(得分:2)

mod_rewrite以线性方式处理规则。首先处理文件顶部的规则。

规则末尾的[nc][L]是处理规则的选项。

  • nc - nocase :不区分大小写
  • L - 最后:执行中的最后一条规则(如果您点击此处,请停止处理)

您需要将www redirect规则置于CI规则之上,以便首先添加www,然后将CI规则应用于新重写的网址。 **并且还在C规则中使用Nwww 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 (停止)

浏览器转到http://mysite.com/index.php/blah并完成第二次重写传递,因为您的异常会停止处理/index.php网址

http://mysite.com/index.php/blah ==成为==> 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''部分不应发生!)。

     

'下一个| N'(下一轮)   重新运行重写过程(从第一个重写规则开始)。这次,要匹配的URL不再是原始URL,而是上次重写规则返回的URL。这对应于Perl next命令或C中的continue命令。使用此标志重新启动重写过程 - 立即转到循环的顶部。   小心不要创建无限循环!

     

'nocase | NC'(无案例)   这使得Pattern不区分大小写,当Pattern与当前URL匹配时忽略'A-Z'和'a-z'之间的差异。   'noescape | NE'(没有输出URI的URI)   此标志阻止mod_rewrite将通常的URI转义规则应用于重写结果。通常,特殊字符(例如'%','$',';'等)将被转义为它们的十六进制等价物(分别为'%25','%24'和'%3B');这个标志可以防止这种情况发生。这允许百分比符号出现在输出中,如