短链域名nginx伪静态配置笔记!

2021-07-14  本文已影响0人  DragonersLi

短链接形如6sk.cc/XYZ后台配置访问这个短链域名:
跳转真实长链接https://xxx.com/product/info/123?uid=123&uuid=456&token=123456
宝塔新建一个项目,只有一个index.php文件,内容如下:域名直接指向。此种方法很容易被sql注入,改写成域名指向tp6下的一个方法。

<?php

$mysqli=new mysqli();
$queryString = str_replace('/', '', $_SERVER['QUERY_STRING']);
file_put_contents('6sk',$queryString."\n\r",FILE_APPEND);
if ($queryString) {
    $mysqli->connect('rm-xxxx.mysql.rds.aliyuncs.com','rdsadmin','password','dbname');
    $mysqli->set_charset("utf8");
    $sql="select * from short_url where short_url = '$queryString'";
    
    $rs = $mysqli->query($sql);
    mysqli_close($mysqli);
    while($row = mysqli_fetch_array($rs, MYSQLI_ASSOC)){
        header("Location:" . $row['url']);
    }
    exit('短链接不存在');
} else {
    exit('参数错误');
}

路由

    // 6sk路由
    Route::group('top6sk', function () use($version){
        Route::get(':str', "{$version}.Top6sk/index")->pattern(['str' => '[\w\-]+']);
    });

控制器

<?php
namespace app\api\controller\v1;



use think\facade\{Request,Db};

class Top6sk extends Base
{

    public function initialize()
    {
        parent::initialize();
    }


    /**
     * 短链域名跳转
     * @return false|string
     */
    public function index(Request $request)
    {

        $str = $request::param('str','');
        if(empty($str))
            return self::error(500,'参数错误');
        $url = Db::name('short_url')->where(['short_url'=>$str])->value('url');
        if(!empty($url)){
            header("Location:" . $url);
        }else{
            return self::error(500,'短链接不存在');
        }

    }



}



nginx域名配置伪静态

 location / {
    if (!-e $request_filename) {
        rewrite  ^(.*)$  https://www.xxx.com/api/top6sk$1  last;  
        break;
    }
}

总结:当我们访问形如:https://6sk.cc/O85WP2时,会自动跳转后台设置的此短链对应的长链接地址。https://www.xxx.com/product/info/678?uid=12345&uuid=3435.流程如下:

短链配置的项目目录和长链一样。都是/www/wwwroot/www.xxx.com,运行目录都是/public,只是域名不一样。
短链项目配置了nginx伪静态,当我们访问短链域名时,伪静态重写路由至https://www.xxx.com/api/top6sk项目的一个方法地址
短链后跟的6位唯一编码会在nginx重写后跟在项目路由配置参数str接收。查库然后跳转长链接。

/**
* 生成6位字符短链方法
*/
 function short_url($url = ''){
        $url = crc32($url);
        $result = sprintf("%u", $url);
        $show = '';
        while($result > 0){
            $s = $result % 62;
            if ($s>35){
                $s=chr($s+61);
            }elseif($s > 9 && $s <= 35){
                $s=chr($s+55);
            }
            $show .= $s;
            $result = floor($result / 62);
        }
       return $show;
    } 

上一篇下一篇

猜你喜欢

热点阅读