Подтвердить что ты не робот

Удаление строки запроса в PHP (иногда на основе referrer)

Привет в Facebook на домашней ссылке есть строка запроса на ней следующим образом: facebook.com/?ref=home, когда вы нажимаете ссылку и переходите на главную страницу, запрос автоматически удаляется. Однако, если я должен был вручную ввести эту ссылку, запрос будет НЕ удален. Любая идея о том, как они это сделали?

4b9b3361

Ответ 1

Самый простой способ в PHP:

$url = preg_replace('/\?.*/', '', $url);

Что делает Facebook, вероятно, это вещь JavaScript:

if (location.href.match(/\?.*/) && document.referrer) {
   location.href = location.href.replace(/\?.*/, '');
}

Ответ 2

Используйте 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']);
}

Ответ 3

Без регулярных выражений или фактического синтаксического анализа URL с помощью parse_url, терпимого к URL-адресам без строки запроса:

$url = reset((explode('?', $url)));

Ответ 4

Вот еще один трюк ответа:

$url = strtok($url, '?');

Это ответ, который вы хотите, если вы когда-либо пытаетесь выиграть у Code Golf. Он имеет...

  • наименьшие символы
  • наименьшие строки
  • наименьшая функция вызывает
  • разумный URL-адрес, есть ли строка запроса

Ответ 5

Я утверждаю, что они проверяют заголовок 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.

Ответ 6

Легче и эффективнее, потому что вам не нужны регулярные выражения.

$url = substr($url,0,strpos($url, '?'));

Другое решение (если вы хотите также получить строку запроса)

list($url,$querystring) = array_pad(explode('?', $url, 2), 2, null));

Ответ 7

Кажется, вы задаете два вопроса. Как определить, была ли страница посещена через 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/ 

Ответ 8

Вы можете использовать это:

function removeQueryStringFromURL ( $url )
{
    $urlparts = parse_url($url);
    if ( $urlparts != FALSE)
    {
       $url = http_build_url("http://[email protected]/pub/index.php?a=b#files", 
                                array( "scheme" =>     $urlparts['scheme'],
                                       "host"   => $urlparts['host'],
                                       "path"   => $urlparts['path']
                                       ));
       return $url;                                
    }
    return $url;
}

Помните, что для этого кода требуется расширение pecl_http.

Ответ 10

Попробуйте это

$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);

Ответ 11

Попробуйте следующее:

$url = strtr('scheme://hostpath', parse_url($url));