如何生成唯一的持久性URL,重定向到随机用户定义的URL数组

时间:2017-11-15 23:54:26

标签: javascript php database url uri

我试图找到一个在线工具来生成一个新链接,该链接随机重定向到用户定义的链接数组。

请查看http://mathstatic.co.nz/auto以了解我要做的事情。该网站的问题在于它是wordpress,您只能输入2个链接。我想做类似的事情,但用户定义的链接数。

请查看我今天放在一起的代码:http://rpantaev.com/RedirectLinkTool/

经过研究,似乎我需要使用PHP,或者像mysql这样的数据库来存储用户'数据,但我不熟悉PHP,所以任何指针都将非常感激。

到目前为止,我的服务器上安装了php,我添加了.htaccess,所以html可以读取php。我整理了一个带有html / css / js的网页,它接受用户定义的链接数,检查http://,存储在数组中并重定向到随机选择的url(数组不是持久的,不会生成新的url)。 / p>

如何重新创建第一个链接的内容并将其合并到我的网站中?

谢谢!

1 个答案:

答案 0 :(得分:0)

因此,您使用的语言取决于您的服务器支持的语言或您是否可以安装自己的语言。如果您希望在计算机上运行服务器来测试它,只需安装您想要使用的语言,然后找到一种在计算机上作为服务器运行的方法。

您可以使用任何数据库(postgres,mongodb)来存储您的网址。如果可以为这个项目使用内存,那么你可以使用字典来存储随机网址。

这是使用Node.js执行此操作的方法。在此解决方案中,我在端口9898上创建服务器并使用字典创建内存数据库。当有条目时,数据库将如下所示:

{
   "uuid1": { id: "uuid1", urls: ["https://www.google.com", "https://youtube.com"] },
   "uuid2": { id: "uuid2", urls: ["https://www.google.com", "https://youtube.com"] }
}

uuid1和uuid2将替换为实际的唯一ID。

在这个解决方案中,我希望客户端会发送一个json对象。

解决方案依赖于expressjs和body-parser包。这是我在计算机上测试的实际代码。

const express = require('express')
const bodyParser = require('body-parser');
const app = express()

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded

const port = 9898
const host = `http://localhost:${port}`

// you would replace this with an actual database
const db = {}

// to generate a uuid
// from: https://stackoverflow.com/a/2117523
function uuidv4() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        const r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });
}

function success(message) {
    return JSON.stringify({
        success: message
    })
}

function error(message) {
    return JSON.stringify({
        error: message
    })
}

// assuming body looks like this { urls: ['www.google.com', 'www.gmail.com'] }
app.post('/gen', (req, res) => {
    const gen = req.body
    // check if the json in the request has the list of urls
    if(!(gen && gen.urls && gen.urls.length > 0)) {
        // if not then log the body and return a json object with the error object
        console.log('body', req.body)
        return res.send(error('I cannot find the list of urls in json body.'))
    }
    // generate a uuid
    const id = uuidv4()
    // save the urls with the new id
    db[id] = {
        id: id,
        urls: gen.urls
    }
    // respond with the url that the user should use
    res.send(success(host + '/' + id))
})

app.get('/:id', (req, res) => {
    // get the id paramater from the request
    const id = req.params.id
    // check if that id was saved, if not send an error message
    if(!db[id]) 
        return res.send(error('that url does not exist'))
    // grab a random element from the list of urls
    const urls = db[id].urls
    const url = urls[Math.floor(Math.random() * urls.length)]
    // redirect the user to the random url
    res.redirect(url)
})

// start the server
app.listen(port, () => {
    console.log('listening on port: '+port);
})

/*

example request:
curl -X POST -H "Content-Type: application/json" -d '{"urls": ["https://www.google.com", "https://www.yahoo.com", "https://www.youtube.com"]}' localhost:9898/gen

after doing this you grab the url generated and paste into your browser.
for example when I ran this it generated: http://localhost:9898/aa582177-4ab5-4ede-99c5-a06b43976c12

*/

如果你从未设置过nodejs项目,那么这个页面可以让你加快速度:https://docs.npmjs.com/getting-started/installing-node 安装nodejs和npm之后。为项目创建一个文件夹。在命令行中,转到此目录。要设置项目并安装两个软件包,请写:

npm init -y
npm install express body-parser

执行此操作后,在该文件夹中创建名为index.js的文件。然后粘贴代码。然后运行服务器使用此命令:

node index.js

如果你在MacOS或Linux上,或者有办法在Windows上使用curl,你可以使用这个示例请求:

curl -X POST -H "Content-Type: application/json" -d '{"urls": ["https://www.google.com", "https://www.yahoo.com", "https://www.youtube.com"]}' localhost:9898/gen

然后应该返回一个供你使用的网址。例如,对我来说它产生了这个:

http://localhost:9898/aa582177-4ab5-4ede-99c5-a06b43976c12

您可以将生成的网址粘贴到浏览器中,然后重新路由到列表中的某个网址。