This question already has an answer here:
-
URL as URL's get parameters - problem with “&”
3 answers
I'm trying to pass a URL as a parameter, but that URL also has parameters. Of course these parameters are important and must be transmitted and properly interpreted.
For example :
http://example.com/myclicktrackingscript.php?source=sidebar&url=http://example.com/redirect_to.php?site=site1
(yes I know, I could click track and redirect all at once in one file, but in some specific situations, I just can't : sometimes I need to pass whatever URL with parameters AS a parameter)
So far i've used URL rewriting :
http://example.com/redirect_to.php?site=site1 => http://example.com/redirect/site1/
.. but that's not very handy (too many specific situations where I need more flexibility)
Is there a better way to do that ?
My guess is maybe hashing the parameter URL :
For example : http://example.com/myclicktrackingscript.php?source=sidebar$url=REJREJ12333232rerereE
... but how to "dehash" it properly ?
I've never used such technique, has anyone any examples / tips / advice about how to do so ?
Thanks
You should just encode parameter:
urlencode('http://example.com/redirect_to.php?site=site1')
And encoded value will be: http%3A%2F%2Fexample.com%2Fredirect_to.php%3Fsite%3Dsite1
you can use urlencode
$parmeter_url = "http://example.com/redirect_to.php?site=site1";
$parmeter_url = urlencode($parmeter_url);
$url = "http://example.com/myclicktrackingscript.php?source=sidebar&url=".$parmeter_url;
echo $url;
see Demo
While urlencode
will work, it is also results in messy (looking, IMOHO) output for this task by default. However, it can be cleaned up!
This is because some "special characters" are allowed in a query string, thus we can fix the over-encoding to make it look prettier.
$encoded = urlencode('http://target.com/foo_bar.php?a=1&b=2');
// Remove unneeded encoding
$encoded = str_replace('%3A', ':', $encoded);
$encoded = str_replace('%2F', '/', $encoded);
$encoded = str_replace('%3F', '?', $encoded);
$encoded = str_replace('%3D', '=', $encoded);
// There are several additional characters that need not be encoded in
// the query string; refer to the link.
This works when $encoded is used in the query portion of the URI.
$url = "http://blah/?url=$encoded";
And should result in a fairly-readable URL like the following. Note the & in the embedded URL is still encoded as it denotes termination between value pairs.
http://blah/?url=http://target.com/foo_bar.php?a=1%26b=2
Where human readability is not desired there are also approaches such as base64-encoding the the URL (which must still be made URI-safe) or using a backend to provide a URL-shortener service (which would allow "http://blah.com/?afjnD" style URLs).
However, hashing by itself will not work because (unless the mapping is persisted) the hash function is a one-way operation and the original data is not recoverable.