RotURL is a simple substitution cipher for encoding/obscuring URLs embedded in other URLs (e.g. in a querystring). Also, common chars that need to be escaped (:/?=&%#
) are mapped to infrequently used capital letters, so this generally yields shorter querystrings, too.
/**
* Rot35 with URL/urlencode-friendly mappings. To avoid increasing size during
* urlencode(), commonly encoded chars are mapped to more rarely used chars.
*/
function rotUrl($url) {
return strtr($url,
'./-:?=&%# ZQXJKVWPY abcdefghijklmnopqrstuvwxyz123456789ABCDEFGHILMNORSTU',
'ZQXJKVWPY ./-:?=&%# 123456789ABCDEFGHILMNORSTUabcdefghijklmnopqrstuvwxyz');
}
rotUrl('https://en.wikipedia.org/w/index.php?title=Special%3ASearch&search=Base64#foo')
== '8MMGLJQQ5EZR9B9G5491ZFI7QRQ9E45SZG8GKM9MC5VxG5391CPcjx51I38WL51I38Vk1L5fdY6FF';
rotUrl(rotUrl($anyUrl)) = $anyUrl;
You could save a few more bytes by encoding the schema (e.g. “h” for http://
, “H” for https://
). Since your end encoding has to be URL-safe, there’s not much you can do beyond this to compress a URL embedded in a URL.
If you use this function, I learned (the hard way) that when decoding it you should switch the parameters for strstr, meaning it should look like this:
return strtr($url,
‘ZQXJKVWPY ./-:?=&%# 123456789ABCDEFGHILMNORSTUabcdefghijklmnopqrstuvwxyz’,
‘./-:?=&%# ZQXJKVWPY abcdefghijklmnopqrstuvwxyz123456789ABCDEFGHILMNORSTU’
);
Eric, that’s not true. Like ROT13 it is its own inverse: https://3v4l.org/M3KXG