Привет в Facebook на домашней ссылке есть строка запроса на нем следующим образом: facebook.com/?ref=home
когда вы щелкаете по ссылке и переходите на главную страницу, запрос автоматически удаляется. Однако, если бы мне пришлось вручную вводить эту ссылку, запрос НЕ удаляется. Любая идея о том, как они это сделали?
Самый простой способ в PHP:
$url = preg_replace('/\?.*/', '', $url);
То, что делает Facebook, вероятно, является чем-то вроде JavaScript:
if (location.href.match(/\?.*/) && document.referrer) { location.href = location.href.replace(/\?.*/, ''); }
Используйте parse_url
для проверки корректного URL-адреса и удаления строки запроса:
$link = 'http://facebook.com/page.php?ref=home'; if ($url = parse_url($link)) { printf('%s://%s%s', $url['scheme'], $url['host'], $url['path']); }
Без регулярных выражений или фактического анализа URL с помощью parse_url
, терпимости к URL-адресам без строки запроса:
$url = reset((explode('?', $url)));
Вот еще один уловка ответа:
$url = strtok($url, '?');
Это ваш ответ, если вы когда-либо пытаетесь выиграть у Code Golf. В нем есть…
Я утверждаю, что они проверяют заголовок HTTP Referrer и видят, произошел ли щелчок от facebook. Таким образом, они могут решить, удалить строку запроса или нет. Что-то вроде:
$refer=$_SERVER["HTTP_REFERER"]; if ($refer == "facebook.com") { // this request was done by clicking a link on facebook .. remove query string. } else { // this request was done by typing the url into the browser }
Вы можете удалить строку запроса, используя предложенный метод netcoder.
Кажется, вы задаете два вопроса. Как определить, была ли страница посещена через facebook или из внешнего местоположения и как удалить строку запроса из URL-адреса.
Вы можете проанализировать реферер, чтобы узнать, является ли домен facebook.
$parts = parse_url($_SERVER['HTTP_REFERER']); if (preg_match('/(^|.)facebook.com/', $parts['host'])) { // remove query string }
Самый безопасный способ удалить строку запроса – также проанализировать URL-адрес и затем перестроить его.
$parts = parse_url('http://www.facebook.com/?ref=home'); $newUrl = $parts['scheme'].'://'.$parts['host'].$parts['path']; // http://www.facebook.com/
Легче и эффективнее, потому что вам не нужны регулярные выражения.
$url = substr($url,0,strpos($url, '?'));
Другое решение (если вы хотите также получить строку запроса)
list($url,$querystring) = array_pad(explode('?', $url, 2), 2, null));
Вы можете использовать это:
function removeQueryStringFromURL ( $url ) { $urlparts = parse_url($url); if ( $urlparts != FALSE) { $url = http_build_url("http://user@www.example.com/pub/index.php?a=b#files", array( "scheme" => $urlparts['scheme'], "host" => $urlparts['host'], "path" => $urlparts['path'] )); return $url; } return $url; }
Помните, что для этого кода требуется расширение pecl_http.
Быстрая и грязная альтернатива для PHP / 5.4.0 и выше:
$url = explode('?', $url, 2)[0];
Демо-версия
Попробуй это
$url_with_querystring = 'www.mydomian.com/myurl.html?unwantedthngs'; $url_data = parse_url($url_with_querystring); $url_without_querystring = str_replace('?'.$url_data['query'], '', $url_with_querystring);
Попробуй это:
$url = strtr('scheme://hostpath', parse_url($url));