2010-11-24 14 views
21

Hallo auf Facebook der Home-Link hat eine Abfragezeichenfolge darauf wie folgt: facebook.com/?ref=home Wenn Sie auf den Link klicken und zur Startseite navigieren, wird die Abfrage automatisch entfernt. Wenn ich diesen Link jedoch manuell eingeben sollte, wird die Abfrage NICHT entfernt. Irgendeine Idee, wie sie das gemacht haben?Entfernen von Abfragezeichenfolge in PHP (manchmal basierend auf Referrer)

+0

ist Ich bin nicht Sicher verstehe ich diese Frage. –

+0

Ich glaube, er möchte wissen, wie man erkennt, ob die Seite durch einen Klick im Browser oder durch Eingabe der URL aufgerufen wurde. Der Titel ist ein bisschen irreführend. –

+0

Sieht so aus, als ob Facebook Javascript dafür benutzt: http://stackoverflow.com/questions/824349/modify-the-url-without-reloading-the-page – Yarin

Antwort

73

Der einfachste Weg, in PHP:

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

Was Facebook tut, ist wohl ein Ding JavaScript, um in dieser Art und Weise:

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

+1 Angenommen, die URL ist absolut gültig. :-) – Orbling

+2

@diyism: Dies ergibt einen E_STRICT-Fehler, weil Sie einen Ausdruck durch Verweis auf 'array_shift' übergeben. Verwenden Sie stattdessen 'current()'. – netcoder

4

ich asssume sie die Referrer-Header prüfen und sehen, ob der Klick entstanden von Facebook. Auf diese Weise können sie entscheiden, ob die Abfragezeichenfolge entfernt werden soll oder nicht. Etwas wie:

$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 
} 

Sie können die Abfragezeichenfolge entfernen, indem Sie die Methode Netcoder vorgeschlagen verwenden.

1

Einfacher und effizienter, weil Sie keine regulären Ausdrücke benötigen.

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

Eine andere Lösung (wenn Sie auch die Query-String abrufen möchten)

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

$ url = substr ($ url, 0, strpos ($ url, '?')); // Wenn URL keine Abfragezeichenfolge hat, wird diese Funktion leer zurückgegeben, was ein Diasater ist. –

+0

Natürlich ist es leer. Wenn Sie ohne weitere Überprüfung sicher gehen wollen: 'list ($ url, $ queryString) = array_pad (explodieren ('?', $ Url, 2), 2, null));' – KingCrunch

+0

Dies beantwortet nicht, wie Facebook tut, was es tut, wie in der Frage des OP gefragt. – Flimm

1

Sie scheinen zwei Fragen zu fragen. So erkennen Sie, ob eine Seite über Facebook oder von einem externen Standort aus besucht wurde und wie Sie die Abfragezeichenfolge aus einer URL entfernen können.

Sie können den Referrer analysieren, um zu sehen, ob die Domain Facebook ist.

$parts = parse_url($_SERVER['HTTP_REFERER']); 
if (preg_match('/(^|.)facebook.com/', $parts['host'])) { 
    // remove query string 
} 

Der sicherste Weg zum Entfernen der Abfragezeichenfolge ist auch die URL analysieren und dann neu erstellen

$parts = parse_url('http://www.facebook.com/?ref=home'); 
$newUrl = $parts['scheme'].'://'.$parts['host'].$parts['path']; // http://www.facebook.com/ 
+0

Sehr gute Beobachtung webbiedave ... er hat tatsächlich zwei Fragen gestellt. Ich bin kein Experte, aber ich bin sicher, dass Facebook eine URL Rewriting Engine/Modul verwendet. Vielleicht zu SEO-Zwecken und vielleicht um URLs zu vereinfachen, die an den Browser geliefert werden. Das würde erklären, warum eine interne Verbindung die Abfrage löschte, wenn sie von einem internen Link kam. Die obige Antwort würde erklären, wie sie es vom Coding-Standpunkt her gemacht hat. –

+0

@Paul: Sie verwenden JavaScript, um das zu tun. Sie verwenden ['history.pushState'] (https://developer.mozilla.org/de/DOM/Manipulating_the_browser_history/), um die URL in der Adressleiste zu ändern, ohne die Seite zu aktualisieren. – Nathan

19

parse_url Verwendung für eine wohlgeformte URL zu überprüfen und die Query-String entfernen:

zu
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; 
} 

Denken Sie daran, dass dieser Code benötigt pecl_http Erweiterung:

$link = 'http://facebook.com/page.php?ref=home'; 
if ($url = parse_url($link)) { 
printf('%s://%s%s', $url['scheme'], $url['host'], $url['path']); 
} 
+0

Beachten Sie, dass '$ url ['path']' die Abfragezeichenfolge nicht enthält. 'parse_url' erlaubt Arbeit, wenn Sie ihm eine relative URL geben. – Flimm

+0

Dies beantwortet nicht, wie Facebook tut, was es tut, wie in der Frage des OP gefragt. – Flimm

1

Sie diese verwenden können Arbeit.

+0

Dies beantwortet nicht, wie Facebook tut, was es tut, wie in der Frage des OP gefragt. – Flimm

12

ohne reguläre Ausdrücke oder Parsen tatsächlich die URL mit parse_url, tolerant von URLs ohne Query-String auch:

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

Strenge Standards: Nur Variablen sollten als Referenz übergeben werden. Versuchen Sie stattdessen '$ url = reset (explode ('?', $ Url));' –

+0

@AnthonyHatzopoulos Ihr "Versuch stattdessen" -Code ist eine exakte Kopie des Codes in der Antwort. –

+3

@Chris Entschuldigung. lol. Es soll dort extra parens geben '$ url = reset ((explode ('?', $ Url)));' [Beispiel] (http://sandbox.onlinephpfunctions.com/code/3ed64996b6456710ba03e6af60d5b8d658eec76c) –

0

Versuchen Sie, diese

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

Dies beantwortet nicht, wie Facebook tut, was es tut, wie in der Frage des OP gefragt. – Flimm

1

A quick and dirty Alternative für PHP/5.4 .0 und größer:

$url = explode('?', $url, 2)[0]; 

Online demo

+0

Dies beantwortet nicht, wie Facebook tut, was es tut, wie in der Frage des OP gefragt. – Flimm

0

Try this:

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

Dies beantwortet nicht, wie Facebook tut, was es tut, wie in der Frage des OP gefragt. – Flimm

8

Hier ist eine andere Partei-Trick einer Antwort:

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

Dies ist die Antwort, die Sie wollen wenn Sie versuchen, bei Code Golf zu gewinnen. Es hat ...

  • die am wenigsten Zeichen
  • die am wenigsten Linien
  • die am wenigsten Funktion aufruft
  • eine vernünftige URL, ob oder ob nicht eine Abfrage-String
+0

Bonus: Wenn Sie wissen, dass es eine Abfragezeichenfolge gibt, können Sie in der nächsten Zeile darauf zugreifen: '$ query_string = strtok ('?');' Sie können es dann direkt an 'parse_str' übergeben. – haz

+0

Dies beantwortet nicht, wie Facebook tut, was es tut, wie in der Frage des OP gefragt. – Flimm

Verwandte Themen