2

在 codeigniter 中,一旦你启用了短 URL,你就有可能重复内容,因为虽然你的新 URL 看起来像:

http://domain.com/privacy_policy

您仍然可以手动访问旧链接,这些链接在您输入时仍会加载:

http://domain.com/index.php/privacy_policy

根据手册,我的 htaccess 文件如下所示:

RewriteEngine On
RewriteBase /

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

我应该怎么做才能解决这个问题?

4

2 回答 2

1

config/config.php,移除index.php$config['index_page']

$config['index_page'] = '';
于 2014-02-07T21:08:13.683 回答
1

您可以通过将用户代理重定向到新 URL 来解决此问题。

方法 #1:使用 htaccess

在 之后使用以下内容RewriteBase /作为第一个 RewriteRule:

RewriteCond %{THE_REQUEST} index\.php
RewriteRule ^index.php(?:/(.*))?$ $1 [R=301,L]

如果您还没有使用过,您可能需要更改$1为.http://example.com/$1RewriteBase

其他规则必须在上述规则之后。

方法 #2:用 PHP 处理

我建议扩展CI_Controller如下:

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        // Execute CI_Controller Constructor
        parent::__construct();

        // Get the index page filename from config.php
        // For perior to PHP 5.3 use the old syntax.
        $index = index_page() ?: 'index.php';

        // Whether the 'index.php' exists in the URI
        if (FALSE !== strpos($this->input->server('REQUEST_URI', TRUE), $index))
        {
            // Redirect to the new address
            // Use 301 for permanent redirection (useful for search engines)
            redirect($this->uri->uri_string(), 'location'/*, 301*/);
        }
    }
}

但是,搜索引擎不会索引看起来像 的 URL index.php/privacy_policy除非您在页面中使用了此类 URL 地址。

此外,您可以在页面中使用规范链接元素,以使搜索引擎仅为其搜索结果索引页面的一个版本:

<link rel="canonical" href="http://domain.com/privacy_policy">

特别是在 CodeIgniter 中:

<link rel="canonical" href="<?php echo base_url(uri_string()); ?>">
于 2014-02-08T09:57:58.440 回答