doulou0882 2015-03-13 06:29
浏览 36
已采纳

自定义配置文件URL,如<site url> / <username> Codeigniter

I want to get the user's profile by www.siteurl.com/user/username instead of www.siteurl.com/user?name=username

This is perfectly working in localhost, but not in live server It just give a 404 Page Not Found, But in localhost it directs to requested url. How can I do this in live server?

This is my code

In config.php enabled the hooks

$config['enable_hooks'] = TRUE; 

Then create a hooks.php adding following code in application->config

$hook=array(
        'pre_system' => array(
                array(
                        'class'    => 'Userlookup',
                        'function' => 'check_uri',
                        'filename' => 'Userlookup.php',
                        'filepath' => 'hooks',
                        'params'   => NULL,
                ),
        ),
);

Then, in application-> hooks create Userlookup.php it contains,

<?php defined('BASEPATH') or die('No direct script access allowed');

class Userlookup{

    protected $uri_username;
    protected $connection_method;

    protected $hostname;
    protected $username;
    protected $password;
    protected $database;

    public function __construct()
    {
        // Configure database connection
        include(APPPATH.'config/database'.EXT);
        $this->hostname = $db[$active_group]['hostname'];
        $this->username = $db[$active_group]['username'];
        $this->password = $db[$active_group]['password'];
        $this->database = $db[$active_group]['database'];

   }

    public function check_uri()
    {
         // First, we need get the uri segment to inspect
         $request_uri = explode('/',substr($_SERVER['REQUEST_URI'], 1));    //$request_uri[0] == username
         $this->uri_username = array_shift($request_uri);                   //string 'socialsite' (length=10)
         $connection_router = array_shift($request_uri);
         $this->connection_method = empty($connection_router) ? 'index' : $connection_router;
         // Connect to database, and check the user table
         mysql_connect($this->hostname, $this->username, $this->password) AND mysql_select_db($this->database);
         $res = mysql_query("SELECT user_Id FROM tbl_user WHERE user_name='".$request_uri[0]."'");
        // $id = mysql_result("SELECT user_Id FROM tbl_user WHERE user_name='".$request_uri[0]."'");
        // var_dump($id,0);die;

        // print_r($id);die;

         if ($row = mysql_fetch_object($res))
         {
                // If, there is a result, then we should modify server data
                // Below line means, we told CodeIgniter to load
                // 'User' controller on 'index', 'info' or any valid connection/method and we send 'id' parameter
                //$_SERVER['REQUEST_URI'] = '/user';
            $id = mysql_result($res,0);
                //print_r($id);die;
                $_SERVER['REQUEST_URI'] = '/user?id='.$id;
                //var_dump($_SERVER['REQUEST_URI']);die;

         }
         mysql_free_result($res);
    }

} 

This is my .htaccess file

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

RewriteRule ^(.*)$ index.php?/$1 [L,QSA]
  • 写回答

2条回答 默认 最新

  • doulu1325 2015-03-26 11:41
    关注

    Finally, I have created the URL as I wanted such as example.com/username. Here I am posting it as a help for others.

    For more

    I used standard MVC

    This type of vanity URL involve URI routing, So add below code for your "application/config/routes.php"

    if($handle = opendir(APPPATH.'/controllers'))
    {
        while(false !== ($controller = readdir($handle)))
            {
                if($controller != '.' && $controller != '..' && strstr($controller, '.') == '.php')
                    {
                        $route[strstr($controller, '.', true)] = strstr($controller, '.', true);
                        $route[strstr($controller, '.', true).'/(:any)'] = strstr($controller, '.', true).'/$1';
                    }
            }
        closedir($handle);
    }
    
    // these are the /username routes
    $route['([a-zA-Z0-9_-]+)'] = 'controller/index/$1';
    

    Then in your controller write you can get the username from GET.

    function index($username = '')
    {
        echo $username;
        //your code here
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同