301使用codeIgniter重定向网站的旧页面

时间:2012-09-05 14:56:27

标签: php .htaccess codeigniter

我刚刚将我的一个静态网站升级为启用了codeIgniter的网站。我需要将旧网站的确切域名重定向到新的域名以避免404错误。

  • 旧网页> http://example.com/pagename.php
  • 新网页> http://example.com/index.php/home/category_images/9(cat_id)

我不是很高。如此难以直接编码所有页面的页面将不会成为问题。我试过了:

RewriteEngine On
RewriteBase /
RewriteRule ^http://www.example.com/pagename.php$ http://example.com/index.php/home/category_images/9 [L,R=301]

不工作,我不明白为什么。我的apache服务器上启用了mod_rewrite

另外,只是为了确认请告诉我在哪个文件夹中我应该放这个文件,我在根目录或Application文件夹之间感到困惑。

谢谢。

版本2:现在在迈克尔先生的建议之后,我尝试使用像这样的重定向函数来实现它:

默认控制器功能:home.php

function __construct()
{
    // Call the Model constructor
    parent::__construct();
    $this->load->model('common_model');
    $this->handle_redirects();
}

function handle_redirects () 
{
    $redirects = Array(
    'gorgeous-girls.php' => 'home/category_images/9'
    );
    $uri = implode('/', $this->uri->segments);
    foreach ($redirects as $from => $to)
    {
        $from = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $from));
        if (preg_match("#^{$from}$#i", $uri))
        {
        if (strpos($to, '$') !== false and strpos($from, '(') !== false)
            $to = preg_replace("#^{$from}$#i", $to, $uri);
        redirect($to , 'location', 301);
        }
    }
}

我的.htaccess看起来像:

RewriteEngine On
RewriteBase /
RewriteCond $1 !^(index.php|resources|robots.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]

PS:我已从我的域名结构中删除了index.php。它看起来像:www.example.com/controller/function/uri/uri

现在我没有从主机收到错误页面,但是我从CodeIgniter收到错误页面。

请帮忙。

3 个答案:

答案 0 :(得分:2)

考虑到您的超文本访问文件应该通过 index.php 路由所有内容,最好使用CodeIgniter的 redirect() 功能处理重定向

下面根据我在 Page 控制器中的内容,在我自己的框架扩展中提供了一个示例(它可以在 redirect() 功能可用,以及 $this->uri->segments

function handle_redirects () {
    $redirects = Array(
        'pagename.php' => 'home/category_images/9'
    );
    $uri = implode('/', $this->uri->segments);
    foreach ($redirects as $from => $to)
    {
        $from = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $from));
        if (preg_match("#^{$from}$#i", $uri))
        {
            if (strpos($to, '$') !== false and strpos($from, '(') !== false)
                $to = preg_replace("#^{$from}$#i", $to, $uri);
            redirect($to , 'location', 301);
        }
    }
}

如果您要将查询传递到框架中的 pagename.php 文件,可以考虑以下内容(请注意,我不知道您网页的用途是什么 - 这个是一个通用的解决方案):

$redirects = Array(
    'pagename.php?q=(:any)' => 'home/category_images/$1'
);

例如:

http://example.com/pagename.php?q=9

会将您重定向到:

http://example.com/home/category_images/9

此解决方案对我很有用,并且在跨浏览器兼容性方面非常有效。

请注意,您的RewriteRules应该如下所示:或类似的内容:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule (xml|txt|css|js|jpg|png|gif)$ - [L]
RewriteRule .* index.php [L,QSA]
  

修改:上述内容已更改为适应资产。基本上,它告诉Apache通过index.php路由所有内容,除非它是一个存在且具有指定扩展名的文件。 (出于安全考虑,这是一种很好的做法。)

     

修改:请注意,您的网址中不应包含index.php,因为.htaccess文件正在删除它。

请注意,我使用PHP 5.3 - 尽管此解决方案应该适合您。如果有任何问题,请告诉我。

答案 1 :(得分:0)

您不要在重写规则的匹配部分中使用整个域名。试试这个:

RewriteRule ^pagename.php$ /index.php/home/category_images/9 [L,R=301]

当然,您可能需要服务器的其他规则才能理解index.php是要调用的文件,而不是/image.php/home/category_images/9

所以也许是第二条规则,比如

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^index.php/(.*) /index.php?q=$1 [L]

我刚刚注意到,在您更新的答案中,您正尝试从www.example.com重定向到example.com。如果您确实想要强制使用一个域,那么您应该在.htaccess中添加另一个规则,然后再提到这样的其他规则:

RewriteCond %{HTTP_HOST} ^www.example.com$
Rewrite Rule ^(.*)$ http://example.com/$1 [L,R=301]

答案 2 :(得分:0)

你可以打开xampp / apache / conf / httpd.conf

然后检查以下行

#LoadModule rewrite_module modules/mod_rewrite.so

如果哈希(#)存在于该行之上。然后删除它。

LoadModule rewrite_module modules/mod_rewrite.so

并重新启动您的Apache服务器并检查您的网站。

在网站不工作之后请告诉我。