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.