diff --git a/.htaccess b/.htaccess
new file mode 100644
index 0000000..5f20b32
--- /dev/null
+++ b/.htaccess
@@ -0,0 +1,14 @@
+Options -Indexes
+order deny,allow
+
+
+deny from all
+
+
+
+deny from all
+
+
+RewriteEngine On
+RewriteCond $1 !^(api|asset)
+RewriteRule ^(\d+|\w+)$ index.php?id=$1
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f292d5e
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Caringor
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..036a451
--- /dev/null
+++ b/README.md
@@ -0,0 +1,44 @@
+# ShortLink
+
+**简体中文** | [English](./README.en.md)
+
+代码基于 [CRZ.im](https://github.com/Caringor/CRZ.im) 二次开发,感谢原作者的辛勤劳动。
+
+## 概述
+
+这是一个网址缩短服务的网站的源代码。
+
+## 安装
+
+### 环境准备
+
++ 兼容 PHP 7.x
++ `Nginx 1.15+`
++ ~~`MySQL 5.5+`~~ (目前还不需要)
+
+提示:若访问量较大,建议安装在具有SSD硬盘的服务器上。
+
+### 配置修改
+
+修改 `config.php` 的相关配置并把 `inc` 目录权限设置为 `755` 即可。
+
+### URL 重写规则
+
+#### Apache 用户
+
+直接使用 `.htaccess` 文件即可。
+
+#### Nginx 用户
+
+需要把 `nginx-rewrite.conf` 里面的内容添加到 `Nginx` 对欲使用网站的配置文件里。
+
+## 功能
+
++ 长链转短链
++ 界面简洁
++ 一键复制
+
+## Todo List
+
++ 增加 `MySQL` 支持
++ More...
diff --git a/api/api.php b/api/api.php
new file mode 100644
index 0000000..7f38166
--- /dev/null
+++ b/api/api.php
@@ -0,0 +1,31 @@
+set_url($_GET['url'], $config['length']);
+ } else if(strstr($_GET['url'], $_SERVER['HTTP_HOST'])) {
+ $opt['content'] = '链接已经是短地址了。';
+ } else if(!$is_link) {
+ $opt['content'] = '请输入正确格式的网址。';
+ }
+ } else {
+ $opt['content'] = '调用参数不能为空。';
+ }
+ // 输出
+ echo json_encode($opt);
+ }
+?>
diff --git a/api/index.php b/api/index.php
new file mode 100644
index 0000000..6c9ed5c
--- /dev/null
+++ b/api/index.php
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/api/set.php b/api/set.php
new file mode 100644
index 0000000..9be7464
--- /dev/null
+++ b/api/set.php
@@ -0,0 +1,30 @@
+set_url($request_arr['url'], $config['length']);
+ } else if(strstr($request_arr['url'], $_SERVER['HTTP_HOST'])) {
+ $opt['content'] = '链接已经是短地址了。';
+ } else if(!$is_link) {
+ $opt['content'] = '请输入正确格式的网址。';
+ }
+ } else {
+ $opt['content'] = '调用参数不能为空。';
+ }
+ // 输出
+ echo json_encode($opt);
+?>
\ No newline at end of file
diff --git a/asset/css/main.css b/asset/css/main.css
new file mode 100644
index 0000000..7ef9ca5
--- /dev/null
+++ b/asset/css/main.css
@@ -0,0 +1,103 @@
+/* Reset */
+* {
+ margin: 0;
+ padding: 0;
+}
+html, body, input, text, textarea {
+ outline: none;
+ font-family: 'Arial', 'Microsoft YaHei', '黑体', '宋体', sans-serif;
+ font-size: 12px;
+}
+html, body {
+ background: #fff;
+}
+a {
+ text-decoration: none;
+}
+a:hover {
+ text-decoration: underline;
+}
+
+/* Main */
+.wrap {
+ text-align: center;
+ overflow: hidden;
+}
+.wrap .meta {
+ margin: 160px 0 0 0;
+ opacity: 0;
+ transform: translateY(-150px);
+ transition: .5s all ease;
+}
+.on .wrap .meta {
+ opacity: 1;
+ transform: translateY(0);
+}
+.wrap .meta .title {
+ line-height: 1em;
+ color: #ff4665;
+ font-size: 42px;
+ text-transform: uppercase;
+}
+.wrap .meta .description {
+ margin: 10px 0 0 0;
+ line-height: 1em;
+ color: #7e7e7e;
+ font-size: 16px;
+ font-weight: normal;
+}
+.wrap .link-area {
+ margin: 50px 0 0 0;
+ opacity: 0;
+ transition: .5s opacity ease;
+}
+.on .wrap .link-area {
+ opacity: 1;
+}
+.wrap .link-area input {
+ display: inline-block;
+ vertical-align: middle;
+}
+.wrap .link-area #url,
+.wrap .link-area #shorturl {
+ width: 320px;
+ height: 32px;
+ line-height: 32px;
+ padding: 0 10px;
+ border: 3px solid #bdc3c7;
+ border-radius: 5px;
+ color: #333;
+}
+.wrap .link-area #url.focus,
+.wrap .link-area #url:focus {
+ border-color: #ff4665;
+ transition: .2s border ease;
+}
+.wrap .link-area #shorturlcopy,
+.wrap .link-area #submit {
+ width: 90px;
+ height: 38px;
+ margin: 0 0 0 5px;
+ background: #ff4665;
+ border-radius: 5px;
+ color: #fff;
+ border: none;
+ cursor: pointer;
+ transition: .2s opacity ease;
+}
+.wrap .link-area #submit:hover {
+ opacity: .75;
+}
+.wrap .link-area #submit:active {
+ opacity: .9;
+}
+.wrap .footer {
+ width: 100%;
+ bottom: 80px;
+ left: 0;
+ position: absolute;
+ color: #7e7e7e;
+}
+.wrap .footer a {
+ color:#ff4665;
+}
\ No newline at end of file
diff --git a/asset/js/app.js b/asset/js/app.js
new file mode 100644
index 0000000..959a636
--- /dev/null
+++ b/asset/js/app.js
@@ -0,0 +1,60 @@
+
+function copyText() {
+ var input = document.getElementById("shorturl");
+ input.select(); // 选中文本
+ document.execCommand("copy"); // 执行浏览器复制命令
+}
+
+
+var APP = (function(){
+
+ var fn = {
+
+ // 生成短地址
+ setUrl: function(self) {
+ var urlEl = document.getElementById('url'),
+ tips = 'https://',
+ request = {"url": urlEl.value};
+ fn.getJson('api/set.php', true, JSON.stringify(request), function(res) {
+ if(res.success == 'true') {
+ //urlEl.className = 'focus';
+ //urlEl.value = res.content.url;
+ $res = document.getElementById('shorturl')
+ $res.className = 'focus';
+ $res.value = res.content.url;
+ } else {
+ urlEl.className = '';
+ urlEl.value = '';
+ urlEl.setAttribute('placeholder', res.content);
+ setTimeout(function() {
+ urlEl.setAttribute('placeholder', tips);
+ }, 2000);
+ }
+ });
+ },
+ // 获取 JSON 数据
+ getJson: function(url, post, data, callback) {
+ var xhr = new XMLHttpRequest(),
+ type = (post) ? 'POST' : 'GET';
+ xhr.onreadystatechange = function() {
+ if(xhr.readyState == 4 && xhr.status == 200) {
+ var json = JSON.parse(xhr.responseText);
+ callback(json);
+ } else if(xhr.readyState == 4) {
+ callback(false);
+ }
+ }
+ xhr.open(type, url, true);
+ xhr.send(data);
+ }
+ },
+ init = function() {
+ setTimeout(function() {
+ var el = document.getElementsByTagName('html')[0];
+ el.className = 'on';
+ }, 10);
+ };
+ return {fn: fn, init: init}
+})();
+
+document.addEventListener('DOMContentLoaded', function() {APP.init();})
\ No newline at end of file
diff --git a/config.php b/config.php
new file mode 100644
index 0000000..0fdbede
--- /dev/null
+++ b/config.php
@@ -0,0 +1,17 @@
+
diff --git a/inc/class/database.db b/inc/class/database.db
new file mode 100644
index 0000000..bacf71a
Binary files /dev/null and b/inc/class/database.db differ
diff --git a/inc/class/db.class.php b/inc/class/db.class.php
new file mode 100644
index 0000000..a04fff2
--- /dev/null
+++ b/inc/class/db.class.php
@@ -0,0 +1,32 @@
+db = new PDO('sqlite:' . dirname(__FILE__) . '/database.db');
+ $this->init_tab();
+ }
+ // 初始化数据库结构
+ function init_tab() {
+ // 网址表
+ $this->db->exec("CREATE TABLE urls(id char(8) PRIMARY KEY, url longtext, ip varchar(16), ua varchar(255))");
+ }
+ // 查询表内容
+ function query($name, $rule = '') {
+ $query = $this->db->prepare("SELECT * FROM $name $rule");
+ $query->execute();
+ $result = $query->fetchAll();
+ return $result;
+ }
+ // 插入表内容
+ function insert($tab, $key, $val) {
+ $exec = $this->db->exec("INSERT INTO $tab ($key) VALUES($val)");
+ if(!$exec) return false;
+ $this->db->beginTransaction();
+ }
+ // 删除表内容
+ function delete($tab, $rule = '') {
+ $exec = $this->db->exec("DELETE FROM $tab $rule");
+ if(!$exec) return false;
+ $this->db->beginTransaction();
+ }
+ }
+?>
\ No newline at end of file
diff --git a/inc/class/url.class.php b/inc/class/url.class.php
new file mode 100644
index 0000000..1af91ba
--- /dev/null
+++ b/inc/class/url.class.php
@@ -0,0 +1,60 @@
+db = $db_c;
+ }
+ // 生成短地址
+ public function set_url($url, $size = 4) {
+ $id = $this->get_id($url);
+ if(!$id) {
+ $id = $this->create_id($url, $size);
+ $ip = get_ip();
+ $ua = get_ua();
+ $this->db->insert('urls', 'id, url, ip, ua', "'$id', '$url', '$ip', '$ua'");
+ }
+ $s_url = get_uri() . $id;
+ return $s_url;
+ }
+ // 生成地址 ID
+ public function create_id($url, $size = 4) {
+ $md5 = md5($url);
+ // 随机抽取 MD5 中的字符作为 ID
+ $id = '';
+ for($i = 0; $i < $size; $i++) {
+ $rand_id = rand(0, strlen($md5) - 1);
+ $id .= $md5[$rand_id];
+ }
+ // ID 检测
+ if($this->has_id($id)) {
+ return $this->create_id($url, $size);
+ } else {
+ return $id;
+ }
+ }
+ // 查询 ID 号
+ public function get_id($url) {
+ $result = $this->db->query('urls', "WHERE url = '$url'");
+ (count($result) > 0) ? $opt = $result[0]['id'] : $opt = false;
+ return $opt;
+ }
+ // 查询目标地址
+ public function get_url($id) {
+ $result = $this->db->query('urls', "WHERE id = '$id'");
+ (count($result) > 0) ? $opt = $result[0]['url'] : $opt = false;
+ return $opt;
+ }
+ // 检测 ID 是否已经存在
+ public function has_id($id) {
+ $result = $this->db->query('urls', "WHERE id = '$id'");
+ (count($result) > 0) ? $opt = true : $opt = false;
+ return $opt;
+ }
+ // 清空短地址
+ public function clean_urls() {
+ $del = $this->db->delete('urls');
+ if($del) return true;
+ return false;
+ }
+ }
+?>
\ No newline at end of file
diff --git a/inc/functions.php b/inc/functions.php
new file mode 100644
index 0000000..d08949e
--- /dev/null
+++ b/inc/functions.php
@@ -0,0 +1,53 @@
+
\ No newline at end of file
diff --git a/inc/index.php b/inc/index.php
new file mode 100644
index 0000000..6c9ed5c
--- /dev/null
+++ b/inc/index.php
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/inc/require.php b/inc/require.php
new file mode 100644
index 0000000..0ad420c
--- /dev/null
+++ b/inc/require.php
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/index.php b/index.php
new file mode 100644
index 0000000..90db8ea
--- /dev/null
+++ b/index.php
@@ -0,0 +1,175 @@
+get_url($_GET['id']);
+ // 重定向至目标网址
+ if($url) {
+ header('Location: ' . $url);
+ exit;
+ }
+ }
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/nginx-rewrite.conf b/nginx-rewrite.conf
new file mode 100644
index 0000000..53dd6bc
--- /dev/null
+++ b/nginx-rewrite.conf
@@ -0,0 +1,8 @@
+# REWRITE START
+location ~ /inc/ {
+ return 404;
+}
+location ~* ^/(?![asset|api]) {
+ rewrite (\d+|\w+)$ /index.php?id=$1;
+}
+# REWRITE END