1

我刚刚将我的一个静态网站升级为启用 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]

不工作,我不知道为什么。mod_rewrite在我的 apache 服务器上启用。

另外,为了确认,还请告诉我应该将该文件放在哪个文件夹中,我在根目录或应用程序文件夹之间感到困惑。

谢谢你。

版本 2:现在根据 Michael 先生的建议,我尝试使用如下所示的重定向功能来实现它:

默认控制器功能: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 收到了错误页面。

请帮忙。

4

3 回答 3

2

考虑到您的超文本访问文件无论如何都应该路由所有内容index.php,最好使用 CodeIgniter 的redirect()函数来处理您的重定向。

下面提供了一个示例,基于我在我的页面控制器中的内容,在我自己的框架扩展中(它可以在任何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,除非它是一个存在并且具有指定扩展名的文件。(出于安全目的,这是一种很好的做法。)

编辑:请注意,您不应包含在您的 URL 中,因为它无论如何index.php都会被文件剥离。.htaccess

请注意,我使用的是 PHP 5.3——尽管这个解决方案应该适合你。如果有任何问题,请告诉我。

于 2012-09-06T07:50:31.707 回答
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]
于 2012-09-05T15:02:31.440 回答
0

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

然后检查下面的行

#LoadModule rewrite_module modules/mod_rewrite.so

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

LoadModule rewrite_module modules/mod_rewrite.so

并重新启动您的 apache 服务器并检查您的站点。

之后网站无法正常工作,请告诉我。

于 2012-09-05T15:04:07.117 回答