ThinkPHP,根据ip定位,切换城市

093832_TRsJ_2519486.png

目标:

    根据用户ip地址打开对应地区的分站

实现:

<?php //入口文件 index.php
function p($msg) {
    echo "<pre>\r\n";
    print_r($msg);
    echo "</pre>\r\n";
}
function v($msg) {
    echo "<pre>\r\n";
    var_dump($msg);
    echo "</pre>\r\n";
}
if (ini_get('magic_quotes_gpc')) {
    function stripslashesRecursive(array $array) {
        foreach ($array as $k => $v) {
            if (is_string($v)) {
                $array[$k] = stripslashes($v);
            } else if (is_array($v)) {
                $array[$k] = stripslashesRecursive($v);
            }
        }
        return $array;
    }
    $_GET = stripslashesRecursive($_GET);
    $_POST = stripslashesRecursive($_POST);
}
//当前目录 非THINKPHP框架需要的路径
define('BASE_PATH', getcwd());
//多城市版本解决方案
define('MY_CITY', true);
define('MY_DOMAIN', 'www.jjab.top'); //设置根域名
static $IpLocation = null;
if (MY_CITY) {
    $city = array();
    $domains = require BASE_PATH . '/Application/Conf/domain.php';
    if ($_SERVER['HTTP_HOST'] == MY_DOMAIN || $_SERVER['HTTP_HOST'] == 'www.' . MY_DOMAIN) { //这种情况下要通过IP来判断一下当前城市!
        require BASE_PATH . '/ThinkPHP/Extend/Library/ORG/Net/IpLocation.class.php'; //包含IP
        $IpLocation = new IpLocation('UTFWry.dat'); // 实例化类 参数表示IP地址库文件
        $result = $IpLocation->getlocation($_SERVER['REMOTE_ADDR']);
        //p($result);
        // Array
        //(
        //    [ip] => 106.117.15.xxx
        //    [beginip] => 106.117.0.0
        //    [endip] => 106.117.48.255
        //    [country] => 河北省石家庄市
        //    [area] => 电信
        //)
        //p($domains);
        foreach ($domains['list'] as $val) {
            if (strstr($result['country'], $val['name'])) {
                $city = $val;
                break;
            }
        }
        //p($city);
        //$city = $domains['default']; //目前直接默认,如果需要后期再改~~
        if (empty($city)) {
            $city = $domains['default'];
        }
        //p($city);
        if (!empty($city)) {
            // print_r($_SERVER);
            // header("Location: http://".$city['domain'].$_SERVER['REQUEST_URI']);die;
            
        }
        // die('该城市站点不存在!#02');
        
    } else {
        foreach ($domains['list'] as $val) {
            if ($_SERVER['HTTP_HOST'] == $val['domain']) {
                $city = $val;
                break;
            }
        }
        if (empty($city)) $city = '';
        define('DB_FILE', $val['domain']); //如果选定了城市,那么就使用选定的城市数据库!
        
    }
}
//多城市解决方案结束
if (!file_exists(BASE_PATH . '/attachs/install.lock')) {
    header("Location: install/index.php");
    die;
}
define('PATH_HOST', md5($_SERVER['HTTP_HOST']));
//调试模式
ini_set('display_errors', 'On');
//error_reporting(0);
define('APP_DEBUG', true);
//定义项目名称
define('APP_NAME', 'Application');
ini_set('date.timezone', 'Asia/Shanghai');
define('NOW_TIME', $_SERVER['REQUEST_TIME']);
define('TODAY', date('Y-m-d', NOW_TIME));
//定义项目路径
define('APP_PATH', BASE_PATH . '/Application/');
header("Content-type: text/html; charset=utf-8");
//加载框架入文件
require './ThinkPHP/ThinkPHP.php';

CommonAction.class.php

<?php
Class CommonAction extends Action {
    protected function _initialize() {
        global $domains, $city;
        if (!cookie('area')) cookie('area', idtoname($city['enname'], 'Area', 'area_id', 'enname'));
    }
}

遇到的问题:

    1, strstr

                php strstr

    2, 权限,路径

                domain.php文件需要有读写的权限

                开始引入domain文件正确,但是后台添加城市的时候没有写入到domain文件,这时候应该查看权限和写入文件时的路径(Linux区分大小写,尤其Windows下开发,服务器是Linux要格外注意)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThinkPHP 中,你可以使用中间件(Middleware)来限制只允许巴西 IP 访问项目。下面是具体的步骤: 1. 创建一个中间件类,可以使用以下命令生成一个中间件文件: ``` php think make:middleware BrazilIPFilter ``` 这将在 `app/middleware` 目录下生成一个名为 `BrazilIPFilter.php` 的中间件文件。 2. 打开生成的 `BrazilIPFilter.php` 文件,可以看到以下内容: ```php <?php namespace app\middleware; class BrazilIPFilter { public function handle($request, \Closure $next) { return $next($request); } } ``` 3. 在 `BrazilIPFilter` 类中的 `handle` 方法中,你可以编写逻辑来判断请求的 IP 是否是巴西 IP。如果是巴西 IP,则继续执行下一个中间件或路由处理程序,否则可以返回自定义的响应或重定向到其他页面。 4. 编写 IP 判断逻辑。你可以使用 PHP 的 `$_SERVER['REMOTE_ADDR']` 变量来获取请求的 IP 地址。然后,通过比较该 IP 地址与巴西 IP 地址列表来判断是否是巴西 IP。以下是一个简单的示例: ```php public function handle($request, \Closure $next) { $allowedIPs = ['127.0.0.1', '192.168.0.1']; // 巴西 IP 列表 $clientIP = $_SERVER['REMOTE_ADDR']; if (!in_array($clientIP, $allowedIPs)) { // 不是巴西 IP,可以返回自定义的响应或重定向到其他页面 return redirect('/other-page'); } return $next($request); } ``` 5. 将中间件应用到路由或全局中。你可以在 `app/middleware` 目录下的 `middleware.php` 文件中,将中间件添加到路由或全局中。以下是一个示例: ```php return [ // 全局中间件 \app\middleware\BrazilIPFilter::class, // 路由中间件 'admin' => \app\middleware\AdminAuth::class, ]; ``` 在上面的示例中,`BrazilIPFilter` 中间件被添加为全局中间件,这意味着它将应用于所有路由。你还可以通过给路由分组或单个路由设置 `'middleware' => ['BrazilIPFilter']` 来将中间件应用于特定路由。 通过以上步骤,你可以限制只允许巴西 IP 访问你的 ThinkPHP 项目。请根据你的实际需求进行相应的修改和调整。如有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值