如何设置正确的CodeIgniter基本URL?

41

当我的网站在开发环境下时,它的url是:testurl.com

现在,在生产服务器上,我的codeigniter应用程序的地址必须为someurl.com/mysite/

我将它移到那里,并且每次我尝试运行一些函数(例如/home/test),它都把我带到someurl.com/home/test这个错误的地址。

它必须是someurl.com/mysite/home/test。如何修复它?我已经设置了

$config['base_url'] = someurl.com/mysite/
17个回答

68

基础URL应该是绝对的,包括协议:

$config['base_url'] = "http://somesite.com/somedir/";
如果使用URL助手,那么base_url()将输出上述字符串。
将参数传递给base_url()site_url()将导致以下结果(假设$config['index_page'] = "index.php";
echo base_url('assets/stylesheet.css'); // http://somesite.com/somedir/assets/stylesheet.css
echo site_url('mycontroller/mymethod'); // http://somesite.com/somedir/index.php/mycontroller/mymethod

对于你在绝对引用问题上的回答表示赞同...但是看到这个,我有一个疑问...将CodeIgniter文件和“somesite”文件放在同一位置(即www)中,这不是一个坏主意吗?我的意思是,这样做会使CodeIgniter文件可以被外部机器人访问吗?只是好奇... - itsols
5
可能是的,有两件事需要考虑:1)所有CI项目文件应该在第一行加入if (!defined('BASEPATH')) exit('No direct script access allowed');。这可以防止脚本自行运行,因为除了CI的前置控制器或其他脚本外,BASEPATH常量未定义(不管在你的情况下是否为www)。2)只要在CI的前置控制器(index.php)中指定它们的路径,你就可以安全地将systemapplication文件夹移到你的Web根目录之外。基本上,你的Web根目录只包含index.php和assets。希望这有所帮助。 - Brendan
如何覆盖 baseUrl 的场景是什么? - Yasar Arafath

22

检查

配置 > 配置

CodeIgniter 文件结构

替换

$config['base_url'] = "your Website url";

随着

$config['base_url']  =  "http://".$_SERVER['HTTP_HOST'];

$config['base_url'] .= preg_replace('@/+$@', '', dirname($_SERVER['SCRIPT_NAME'])).'/';

缺少https检测。 - Marco Demaio
为什么有人要使用 preg_replace('@/+$@',...) 来从字符串中删除前导斜杠,而 ltrim($string, '/') 是一个更简单/轻量级的选项? - mickmackusa

15

很有趣,下面是快速且有效的代码:

index.php

/**
 * Define APP_URL Dynamically
 * Write this at the bottom of index.php
 *
 * Automatic base url
 */
define('APP_URL', ($_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http') . "://{$_SERVER['SERVER_NAME']}".str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME'])); 

config.php

/*
|--------------------------------------------------------------------------
| 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'] = APP_URL;

CodeIgniter 真是太棒了!!! :)


5
如果留空,自从版本2.0.0起,该框架将尝试自动检测它。
但在3.0.0中不会这样做,请参见此处:config.php

4
我认为CodeIgniter 3建议手动设置$config ['base_url']的完整url,以避免HTTP头注入的风险。

如果您不担心这个问题,您可以简单地在application/config/config.php中添加以下几行:

defined('BASE_URL') OR define('BASE_URL', (is_https() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . dirname($_SERVER['SCRIPT_NAME']) . '/');
$config['base_url'] = BASE_URL;

这样一来,您的项目代码中(包括视图)也可以使用BASE_URL常量,而无需使用函数:

config_item('base_url') //returns BASE_URL
$this->config->item('base_url'); //returns BASE_URL

使用SERVER_NAME代替HTTP_HOST更加安全。 - kodmanyagha
据我所知,@kodmanyagha的说法并不正确。在许多情况下,SERVER_NAME只是从HTTP_HOST中填充而来。为了最大程度的安全性,唯一的方法是检查允许的主机名,参见https://dev59.com/RnM_5IYBdhLWcg3wQQpd#1459794。 - Marco Demaio

2
在 config.php 中声明基础 URL 后,(注意,如果仍然遇到相同的错误,请检查 autoload.php)。
$config['base_url'] = "http://somesite.com/somedir/";

勾选“autoload”

CodeIgniter文件结构:

\application\config\autoload.php

并在自动加载时启用:

$autoload['helper'] = array(**'url',** 'file');

它能够正常工作。


2

这是针对服务器和实时网站的,我在hostinger.com上申请并已成功运行。

第一步:$config['base_url'] = 'http://yoursitename.com'; (在config.php文件中)

第二步:src="<?=base_url()?>assest/js/wow.min.js" (在视图文件中)

第三步:href="<?php echo base_url()?>index.php/Mycontroller/Method" (用于链接或调用方法)


0

您可以在任何服务器上使用默认的基本URL路径,这需要在config文件夹中的config.php文件中进行替换:

$config['base_url'] = 'index.php';

通过这段代码: $config['base_url'] = "http://".$_SERVER['HTTP_HOST']; $config['base_url'] .= preg_replace('@/+$@','',dirname($_SERVER['SCRIPT_NAME'])).'/';

它可以自动从任何服务器中找到你的文件夹。


0

应用程序 > 配置 > config.php

搜索 $config['base_url'] 并将您的站点放置在 "//example.com"(跳过协议)

 $config['base_url'] = "//someurl.com/";

这对我有效。


0
在您的配置文件中,将$config['base_url'] = ''留空即可。 base_url将自动创建一个。在您的Codeigniter system/core/Config.php中。
        // Set the base_url automatically if none was provided
        if (empty($this->config['base_url']))
        {
            if (isset($_SERVER['SERVER_ADDR']))
            {
                if (strpos($_SERVER['SERVER_ADDR'], ':') !== FALSE)
                {
                    $server_addr = '['.$_SERVER['SERVER_ADDR'].']';
                }
                else
                {
                    $server_addr = $_SERVER['SERVER_ADDR'];
                }

                $base_url = (is_https() ? 'https' : 'http').'://'.$server_addr
                    .substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME'])));
            }
            else
            {
                $base_url = 'http://localhost/';
            }

            $this->set_item('base_url', $base_url);
        }

这段代码已经可以自动创建基本的URL和协议。

谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接