parent
c998aed46b
commit
4f88793572
1 changed files with 241 additions and 0 deletions
@ -0,0 +1,241 @@ |
|||||||
|
#!/usr/bin/node |
||||||
|
|
||||||
|
let fs = require('fs'), |
||||||
|
path = require('path'), |
||||||
|
args = process.argv.slice(2), |
||||||
|
input = "-", // - will reperesent stdin |
||||||
|
output = "-", // - will represent stdout |
||||||
|
delimiter = ","; |
||||||
|
let Reset = "\x1b[0m", |
||||||
|
Bright = "\x1b[1m", |
||||||
|
Dim = "\x1b[2m", |
||||||
|
Underscore = "\x1b[4m", |
||||||
|
Blink = "\x1b[5m", |
||||||
|
Reverse = "\x1b[7m", |
||||||
|
Hidden = "\x1b[8m", |
||||||
|
|
||||||
|
FgBlack = "\x1b[30m", |
||||||
|
FgRed = "\x1b[31m", |
||||||
|
FgGreen = "\x1b[32m", |
||||||
|
FgYellow = "\x1b[33m", |
||||||
|
FgBlue = "\x1b[34m", |
||||||
|
FgMagenta = "\x1b[35m", |
||||||
|
FgCyan = "\x1b[36m", |
||||||
|
FgWhite = "\x1b[37m", |
||||||
|
|
||||||
|
BgBlack = "\x1b[40m", |
||||||
|
BgRed = "\x1b[41m", |
||||||
|
BgGreen = "\x1b[42m", |
||||||
|
BgYellow = "\x1b[43m", |
||||||
|
BgBlue = "\x1b[44m", |
||||||
|
BgMagenta = "\x1b[45m", |
||||||
|
BgCyan = "\x1b[46m", |
||||||
|
BgWhite = "\x1b[47m"; |
||||||
|
|
||||||
|
if( args[0] == "-h" || args[0] == "--help" ){ |
||||||
|
console.log(FgGreen + "Aquarius Redirects (beta)" + Reset); |
||||||
|
console.log(); |
||||||
|
console.log("This takes a csv file from stdinput or a given filename as the first parameter"); |
||||||
|
console.log(); |
||||||
|
console.log(FgGreen + "Example:" + Reset); |
||||||
|
console.log("aquarius-redirects test.csv \t\t\t This will take each line of a csv file and turn it into a redirect"); |
||||||
|
console.log("cat test.csv | aquarius-redirects\t\t This is equivilent to the above"); |
||||||
|
console.log("echo \"/test/, /test-2/\" | aquarius-redirects\t This will create a redirect from /test/ to /test-2/"); |
||||||
|
console.log(); |
||||||
|
console.log(); |
||||||
|
console.log(); |
||||||
|
console.log(FgGreen + "The CSV File" + Reset); |
||||||
|
console.log(); |
||||||
|
console.log("Each row in the CSV file should respond to a redirect."); |
||||||
|
console.log("\t 1. From URL"); |
||||||
|
console.log("\t 2. To URL"); |
||||||
|
console.log("\t 3. Redirect Type"); |
||||||
|
console.log("\t 4. Exact "); |
||||||
|
console.log(); |
||||||
|
console.log(FgGreen + "E.g." + Reset); |
||||||
|
console.log("/page-1/ | /page-2/ | | "); |
||||||
|
console.log("/about-us/meet-the-team/ | /meet-the-team/ | | "); |
||||||
|
console.log("/about-us/meet-the-team/*/ | /meet-the-team/*/ | | true "); |
||||||
|
console.log("//google.com/page-1/ | /page-2/ | | "); |
||||||
|
console.log("//google.com/page-1/ | //google.co.uk/page-2/ | 302 | true "); |
||||||
|
console.log("//google.com/*/ | //google.co.uk/*/ | | "); |
||||||
|
console.log(); |
||||||
|
console.log(FgGreen + "From URL" + Reset); |
||||||
|
console.log("This is the URL that should be redirected away from"); |
||||||
|
console.log("It can optionally contain a * symbol do denote a wildcard expresion"); |
||||||
|
console.log("For exmaple, /about-us/*/ will redirect from any child page of /about-us/"); |
||||||
|
console.log(""); |
||||||
|
console.log(FgGreen + "To URL" + Reset); |
||||||
|
console.log("This is the URL that should be redirected to"); |
||||||
|
console.log("It can optionally contain an * symbol if you contained one in the From URL"); |
||||||
|
console.log("For exmaple, /about-us/*/ in From and /about/*/ in To will redirect all child pages of about us to the corresponding page under about"); |
||||||
|
console.log(""); |
||||||
|
console.log(FgGreen + "Redirect Type" + Reset); |
||||||
|
console.log("This is the redirect type"); |
||||||
|
console.log("This is optional and contains the responce code that will be sent with the redirection request."); |
||||||
|
console.log("The default is 301 which is a permenant redirect. You might want to make this 302 which implies a temporary redirect"); |
||||||
|
console.log(""); |
||||||
|
console.log(FgGreen + "Exact" + Reset); |
||||||
|
console.log("This denotes whether the trailing slash should be optional on the from URL"); |
||||||
|
console.log("This defualts to false"); |
||||||
|
console.log("If true, the From url /about-us != /about-us/ "); |
||||||
|
|
||||||
|
|
||||||
|
process.exit(0); |
||||||
|
} |
||||||
|
|
||||||
|
if(args[0] != undefined && args[0] != ""){ |
||||||
|
input = args[0]; |
||||||
|
} |
||||||
|
|
||||||
|
if(input == "-" ) { // We are reading from stdin |
||||||
|
process.stdin.setEncoding('utf-8'); |
||||||
|
let contents = ""; |
||||||
|
process.stdin.on("readable", () => { |
||||||
|
let back = process.stdin.read(); |
||||||
|
if (back != null){ |
||||||
|
contents = contents + back; |
||||||
|
} |
||||||
|
}); |
||||||
|
process.stdin.on("end", () => { |
||||||
|
doRedirects(contents); |
||||||
|
}); |
||||||
|
//console.error("I haven't implemented stdin yet"); |
||||||
|
//process.exit(1); |
||||||
|
} else { |
||||||
|
|
||||||
|
fs.readFile(input, {encoding: 'utf-8'}, function(err,data){ |
||||||
|
if (!err) { |
||||||
|
doRedirects(data) |
||||||
|
} else { |
||||||
|
console.log(err); |
||||||
|
process.exit(1); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function doRedirects(data){ |
||||||
|
let lines = data.split("\n"); |
||||||
|
for (let i = 0; i < lines.length; i++){ |
||||||
|
lines[i] = lines[i].split(","); |
||||||
|
for (let j = 0; j < lines[i].length; j++){ |
||||||
|
lines[i][j] = lines[i][j].replace(/^\s*/g,""); |
||||||
|
lines[i][j] = lines[i][j].replace(/\s*$/g,""); |
||||||
|
} |
||||||
|
if (lines[i].length > 1){ |
||||||
|
let from = lines[i][0], |
||||||
|
to = lines[i][1], |
||||||
|
type = lines[i][2] || 301, |
||||||
|
exact = lines[i][3] || false; |
||||||
|
let redirect = individualRedirect(from,to,type,exact); |
||||||
|
process.stdout.write("###Redirect from "+from+" to "+to+"###\n"); |
||||||
|
process.stdout.write(redirect+"\n"); |
||||||
|
process.stdout.write("\n"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function individualRedirect(from, to, type, exact){ |
||||||
|
var ret = ""; |
||||||
|
if(!from){ |
||||||
|
throw new Error( "You must have a from url" ); |
||||||
|
} |
||||||
|
if(!to){ |
||||||
|
throw new Error( "You must have a to url" ); |
||||||
|
} |
||||||
|
if(!type){ |
||||||
|
type = 301; |
||||||
|
} |
||||||
|
if(!exact){ |
||||||
|
exact = false; |
||||||
|
} |
||||||
|
if(typeof exact == "string" && exact.toLowerCase() != "true"){ |
||||||
|
exact = false; |
||||||
|
} |
||||||
|
from = splitURL_(from); |
||||||
|
if(from.domain != ""){ |
||||||
|
ret += "RewriteCond %{HTTP_HOST} ^" + escape_(from.domain) + "$\n"; |
||||||
|
} |
||||||
|
for (var i in from.queries){ |
||||||
|
ret += "RewriteCond %{QUERY_STRING} (^|&)" + i + ((from.queries[i] !== undefined)?("\=" + from.queries[i]):"") + "($|&)\n"; |
||||||
|
} |
||||||
|
ret += "RewriteRule " + doFrom_(from.path,exact) + " " + doTo_(to) + " " + doRewrite_(type); |
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
function doFrom_(from,exact){ |
||||||
|
if(from[0]=="/"){ |
||||||
|
from = "^" + from.substring(1,from.length); |
||||||
|
} |
||||||
|
if(!exact){ |
||||||
|
if(from[from.length-1]=="/"){ |
||||||
|
from = from+"?"; |
||||||
|
} else { |
||||||
|
from = from + "\/?"; |
||||||
|
} |
||||||
|
} |
||||||
|
from = escape_(from); |
||||||
|
return from + "$"; |
||||||
|
} |
||||||
|
|
||||||
|
function escape_(url){ |
||||||
|
return url.replace(/\//g,"\\\/") |
||||||
|
.replace(/\-/g,"\\\-") |
||||||
|
.replace(/\./g,"\\\.") |
||||||
|
.replace(/\*/g,"(.*?)"); |
||||||
|
} |
||||||
|
|
||||||
|
function doTo_(to){ |
||||||
|
if(to[0]!="/" && to.indexOf("//")==-1){ |
||||||
|
to = "/"+to; |
||||||
|
} |
||||||
|
to = to |
||||||
|
.replace(/\*/g,"$1"); |
||||||
|
return to; |
||||||
|
} |
||||||
|
|
||||||
|
function doRewrite_(type){ |
||||||
|
return "[L,R="+type+"]"; |
||||||
|
} |
||||||
|
|
||||||
|
function splitURL_(url){ |
||||||
|
ret = { |
||||||
|
protocol:"", |
||||||
|
domain:"", |
||||||
|
path:"", |
||||||
|
queries:{} |
||||||
|
}; |
||||||
|
|
||||||
|
var p=url.indexOf("//"); |
||||||
|
if(p!=-1){ |
||||||
|
//Gets the protocol |
||||||
|
ret.protocol = url.substring(0,p-1); |
||||||
|
//Removes up to and including the protocol |
||||||
|
url = url.substring(p+2) |
||||||
|
|
||||||
|
var d = url.indexOf("/"); |
||||||
|
if(d!=-1){ |
||||||
|
//gets the domain |
||||||
|
ret.domain = url.substring(0,d); |
||||||
|
url=url.substring(d); |
||||||
|
} else { |
||||||
|
ret.domain = url; |
||||||
|
url = ""; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var q=url.indexOf("?"); |
||||||
|
if(q!=-1){ |
||||||
|
queries = url.substring(q+1).split("&"); |
||||||
|
for (var i = 0; i<queries.length; i++){ |
||||||
|
ret.queries[queries[i].split("=")[0]] = queries[i].split("=")[1]; |
||||||
|
} |
||||||
|
|
||||||
|
url = url.substring(0,q); |
||||||
|
} |
||||||
|
|
||||||
|
ret.path=url; |
||||||
|
|
||||||
|
|
||||||
|
return ret; |
||||||
|
} |
Loading…
Reference in new issue