codeigniter 将非 www 重定向到 www

Posted

技术标签:

【中文标题】codeigniter 将非 www 重定向到 www【英文标题】:codeigniter redirect non-www to www 【发布时间】:2011-12-01 18:34:10 【问题描述】:

我看到了.htaccess Redirect non-WWW to WWW preserving URI string,但它对我不起作用

如果我转到 mysite.com/site/something,我会被重定向到 mysite.com/something

RewriteCond %HTTP_HOST !^www\.mysite\.com$
RewriteRule (.*) http://www.mysite.com/$1 [R=301,L]

也试过了:

RewriteCond %HTTP_HOST .
RewriteCond %HTTP_HOST !^www.mysite.com [NC]
RewriteRule (.*) http://www.mysite.com/$1 [R=301,L]

编辑:

这是我使用的代码,基于 Alfonso Rubalcava 的回答:

if (substr($_SERVER['SERVER_NAME'], 0, 3) != 'www')


    if ($_SERVER['REQUEST_URI'] == '//site/')
    
        header('HTTP/1.1 301 Moved Permanently');
        header('Location: http://www.site.com/site/');
        exit;
    

    header('HTTP/1.1 301 Moved Permanently');
    header('Location: http://www.site.com' . $_SERVER['REQUEST_URI']);
    exit;


【问题讨论】:

这个//site/ 看起来像是一个格式错误的链接。您可能希望在代码中更正(在视图中?)以避免搜索引擎将其索引为这样。 哦..链接不是格式错误,必须是带有 CI 路由或 htaccess 的东西才能删除 index.php..当我在浏览器上输入地址时行为是相同的 http://www.site.com//site/? 我以为你的意思是我把链接弄错了 更好地使用header("Location: http://www.".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']); 使其动态 【参考方案1】:

试试,在 index.php 的开头:

if(substr($_SERVER['SERVER_NAME'],0,3)=="www")
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: http://yourdomain.tdl/".$_SERVER['REQUEST_URI']);
else
    //the current contents of your file

编辑 我看错了你的问题,答案是:

if(substr($_SERVER['SERVER_NAME'],0,3)!="www")
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: http://www.yourdomain.tdl/".$_SERVER['REQUEST_URI']);
else
    //the current contents of your file

【讨论】:

我不能只使用htaccess吗? 是的,你可以。这只是使用更熟悉且问题更少的方法的一种方法......并且每次从服务器迁移时都不需要调整。 谢谢,它有效..顺便说一句,我删除了“else”语句并使用了“exit;”在 if 结束时:] 哦..唯一的问题是,如果我转到“mysite.com/site”,我会被重定向到“mysite.com//site”,然后出现 404 错误.. yourdomain.tdl/".$_SERVER[ 中删除/ 我很高兴它有用。【参考方案2】:

在 codeigniter 的 .htaccess 文件中包含这两行以将非 www url 重定向到 www

RewriteCond %HTTP_HOST !^www\.(.*)
RewriteRule (.*) http://www.%HTTP_HOST/$1 [R=301,L]

即完整的 .htaccess 文件将是这样的->

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

【讨论】:

【参考方案3】:

使用此代码

#Redirect to www
RewriteEngine On
RewriteCond %HTTP_HOST ^[^.]+\.[^.]+$
RewriteCond %HTTPSs ^on(s)|
RewriteRule ^ http%1://www.%HTTP_HOST%REQUEST_URI [L,R=301]

【讨论】:

【参考方案4】:

我知道,这个问题已经有了一个公认的解决方案。但是如果域也有一些子域,就会出现问题。如果您的 codeigniter 也处理子域,则子域也将被重定向到 www。

这是本案的答案。假设你的域名是 www.thedomain.com,代码应该是:

$sna = explode(".", $_SERVER['SERVER_NAME']);
if($sna[0]=="thedomain")
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: http://www.thedomain.com/".$_SERVER['REQUEST_URI']);

【讨论】:

【参考方案5】:

您可以在所有 codeigniter 网站中使用以下代码。

`

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

`

【讨论】:

以上是关于codeigniter 将非 www 重定向到 www的主要内容,如果未能解决你的问题,请参考以下文章

将非 WWW 重定向到 WWW 格式并重定向到 VirtualHost 中的 HTTPS

NGINX 将 http 重定向到 https,将非 www 重定向到 ww

将非www重定向到www的最佳方法?

将非 WWW 重定向到 WWW URL

web.config 将非 www 重定向到 www

将非 www URL 重定向到 www URL