【问题标题】:Problem redirect CodeIgniter URLs to WWW问题将 CodeIgniter URL 重定向到 WWW
【发布时间】:2011-09-25 13:21:27
【问题描述】:

我有一个使用 .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 的一部分出现。

到目前为止,一切都很好。一切正常。现在,为了搜索引擎优化,我想强制所有流量到 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 URL 重写为http://www.jungledragon.com/anything URL。这种工作,但它带回了 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]

【问题讨论】:

    标签: codeigniter mod-rewrite url-rewriting


    【解决方案1】:

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

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

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

    您需要将 www redirect 规则放在 CI 规则之上,以便它首先添加 www,然后将 CI 规则应用于新重写的 url。 **并且还将CN 标志与www redirect 规则一起使用,以便解析下一条规则。

    http://mysite.com/blah ==becomes==> http://www.mysite.com/blah ==becomes==> 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,对不起。

    以下是文档摘录,概述了您可能需要的标志:

    'chain|C'(与下一条规则链接) 此标志将当前规则与下一个规则链接(其本身可以与以下规则链接,依此类推)。这具有以下效果:如果规则匹配,则处理照常继续 - 标志无效。如果规则不匹配,则跳过所有后续的链式规则。例如,它可用于删除不应出现的.www'' part, inside a per-directory rule set, when you let an external redirect happen (where the.www'' 部分!)。

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

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

    【讨论】:

    • OPs 规则中没有 [C] 标志,只有 [NC]。您还可以发布 Apache 的 mor_rewrite 手册的链接,以便 OP 自己了解更多信息。
    • 抱歉还没回复,我还在上班,今晚试试。
    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2011-10-13
    • 2015-08-03
    • 2019-03-09
    • 2011-11-05
    • 2013-12-20
    相关资源
    最近更新 更多