Передача параметра із URL, який містить свої параметри

Вирішив я створити лічильник відвідуваності сайту за допомогою AJAX, через те, що, по-перше, він працює на статичних і закешованих сторінках, а по-друге, через його асинхронну роботу (сторінка, на якій встановлено лічильник не буде "чекати" завершення роботи лічильника). І тут виявилась трохи несподівана проблема, коли я захотів передавати на сервер один параметр із URL, який містить свої параметри (ref=http://www.google.com.ua/url?par1=1&par2=2&par3=3). Несподівана, бо я звик що в РНР можна передавати будь-який (екранований) текст в одинарних лапках. А тут екрануй, не екрануй... (хоча це із іншої теми =).

Якщо передавати параметр ref через $_GET чи $_POST наприклад так: ref=http://www.google.com.ua/url?par1=1&par2=2&par3=3 або так ref="http://www.google.com.ua/url?par1=1&par2=2&par3=3", або так ref='http://www.google.com.ua/url?par1=1&par2=2&par3=3', все одно на сервер в масивах $_GET чи $_POST отримуємо три параметра замість одного: перший ref='http://www.google.com.ua/url?par1=1, другий par2=2, третій par3=3.

Очевидно, що вся справа в амперсандах, і перше що спало на думку - замінити ці амперсанди на щось інше, наприклад на крапку з комою:

var ref = document.referrer.replace(new RegExp('&','g'),';');
// буква g означає, що заміна у всьому рядку
І справді спрацювало. Далі я порився в інтернеті недовго і знайшов ще одне рішення, яке трохи затратніше в ресурсах і коді, але в результаті ми отримуємо незмінений URL.

Для цього потрібно дві речі. Перша річ, це аналог РНР-функції rawurlencode() на JavaScript, яка закодовує URL за допомогою такої "розумної" специфікації RFC1738 =):

function rawurlencode (str)
{
	// джерело коду: http://phpjs.org/functions/rawurlencode
	str = (str + '').toString();
	return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').
	replace(/\)/g, '%29').replace(/\*/g, '%2A');
}
var ref = rawurlencode (document.referrer);
$.ajax({type: 'POST',url: "/counter.php",cache:false, data: 'ref='+ref});
// де /counter.php є моїм файлом лічильника
Друга річ, звичайно, це розкодування на стороні сервера із допомогою РНР:
<?php
$HTTP_REFERER = rawurldecode( mysql_real_escape_string(@$_POST['ref'], $link) );
// $link це ідентифікатор з'єднання із базою даних
?>
Якщо ви знайшли помилку, прохання - виділіть текст помилки (максимум 127 символів) і натисніть Ctrl+Enter.