我发现的是3.1.6之后的版本里,需要对/application/config/config.php中的base_url进行设置。

查找资料说,之前的版本(2.2.5)里base_url默认置空:

/*
|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
|    http://example.com/
|
| If this is not set then CodeIgniter will guess the protocol, domain and
| path to your installation.
|
*/
$config['base_url']    = '';

ci会自己去猜测协议,域名,及安装路径。大体应该是通过REQUEST_URI之类的请求地址解析出来的。然后base_url(),site_url()等函数使用解析出来的base_url去拼接资源的公网地址。

但新版里(3.1.8)是这样的:

/*
|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
|    http://example.com/
|
| WARNING: You MUST set this value!
|
| If it is not set, then CodeIgniter will try guess the protocol and path
| your installation, but due to security concerns the hostname will be set
| to $_SERVER['SERVER_ADDR'] if available, or localhost otherwise.
| The auto-detection mechanism exists only for convenience during
| development and MUST NOT be used in production!
|
| If you need to allow multiple domains, remember that this file is still
| a PHP script and you can easily do that on your own.
|
*/
$config['base_url']    = '';

虽然默认值还是空字串,但上面有警告:一定要设置这个值。也就是说这个值在新版本里变成了必填值,必须要配置的项。
下面的话就是,如果没有设置,ci还是会去猜测协议,域名,及安装路径,但这只适用于开发环境(自己本地做了域名解析的除外),由于安全因素,一定不能在生产环境使用。然后提醒你,当前配置文件也是一个php脚本,所以是可以自定义一些逻辑判断的,如:设置一个域名白名单,只有在白名单内的域名才可以执行当前项目脚本。结合网上给出的案例,base_url新的配置方案如下:

$allowed_domains = array('xx.localhost', 'xx.jason.com', 'xx.seasidecrab.com');
$default_domain  = 'localhost';

if (in_array($_SERVER['HTTP_HOST'], $allowed_domains, TRUE))
{
    $domain = $_SERVER['HTTP_HOST'];
}
else
{
    $domain = $default_domain;
}

if ( is_https() )
{
    $config['base_url'] = 'https://'.$domain.'/bracelet/shop2/';
}
else
{
    $config['base_url'] = 'http://'.$domain.'/bracelet/shop2/';
}

我是习惯本地做域名解析,如xx.jason.com。这种情况下,是要设置base_url的。然后本地一个环境,家里一个环境,服务器测试一个环境,正式一个环境(正式上线后,可以把其他环境项去掉)。然后对于协议做了一个适配。

注:ci的2.x.x版本里是没有is_https()方法的。