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)
Antwort
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(/\?.*/, '');
}
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.
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));
$ url = substr ($ url, 0, strpos ($ url, '?')); // Wenn URL keine Abfragezeichenfolge hat, wird diese Funktion leer zurückgegeben, was ein Diasater ist. –
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
Dies beantwortet nicht, wie Facebook tut, was es tut, wie in der Frage des OP gefragt. – Flimm
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/
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. –
@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
parse_url
Verwendung für eine wohlgeformte URL zu überprüfen und die Query-String entfernen:
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']);
}
Sie diese verwenden können Arbeit.
Dies beantwortet nicht, wie Facebook tut, was es tut, wie in der Frage des OP gefragt. – Flimm
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)));
Strenge Standards: Nur Variablen sollten als Referenz übergeben werden. Versuchen Sie stattdessen '$ url = reset (explode ('?', $ Url));' –
@AnthonyHatzopoulos Ihr "Versuch stattdessen" -Code ist eine exakte Kopie des Codes in der Antwort. –
@Chris Entschuldigung. lol. Es soll dort extra parens geben '$ url = reset ((explode ('?', $ Url)));' [Beispiel] (http://sandbox.onlinephpfunctions.com/code/3ed64996b6456710ba03e6af60d5b8d658eec76c) –
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);
Dies beantwortet nicht, wie Facebook tut, was es tut, wie in der Frage des OP gefragt. – Flimm
A quick and dirty Alternative für PHP/5.4 .0 und größer:
$url = explode('?', $url, 2)[0];
Dies beantwortet nicht, wie Facebook tut, was es tut, wie in der Frage des OP gefragt. – Flimm
Try this:
$url = strtr('scheme://hostpath', parse_url($url));
Dies beantwortet nicht, wie Facebook tut, was es tut, wie in der Frage des OP gefragt. – Flimm
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
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
Dies beantwortet nicht, wie Facebook tut, was es tut, wie in der Frage des OP gefragt. – Flimm
- 1. Umleitung basierend auf Referrer URL
- 2. Wie URL-Abfragezeichenfolge in HTTP Referrer
- 3. JavaScript Redirect basierend auf Referrer?
- 4. Umleiten von URLs basierend auf Abfragezeichenfolge?
- 5. Wie ändere ich Inhalt basierend auf Abfragezeichenfolge?
- 6. Umleiten mit htaccess basierend auf Referrer
- 7. Seite + Abfragezeichenfolge von URL entfernen
- 8. Über Referrer php vorbei
- 9. nginx Abfragezeichenfolge von bestimmter URL entfernen
- 10. Entfernen Sie einen Wert aus einer Abfragezeichenfolge
- 11. Abrufen der Referrer-URL in PHP (einschließlich der Parameter)
- 12. Htaccess-Umgebungsvariable basierend auf Abfragezeichenfolge ohne einige Pamameter
- 13. Löschen oder Entfernen der Abfragezeichenfolge in ASP.Net
- 14. PHP Referrer-Domäne und Unterdatei
- 15. Untersuchen Sie die Referrer in PHP
- 16. Spring - Annotation Based Controller - RequestMapping basierend auf Abfragezeichenfolge
- 17. Hört PHP manchmal Funktionsdeklarationen?
- 18. PHP - Alias - permanente Domain zwischen Referrer
- 19. Entfernen der Abfragezeichenfolge für SEO-Verbesserungen
- 20. Htaccess - Redirect von Referrer
- 21. Einen bestimmten Teil einer Abfragezeichenfolge ersetzen PHP
- 22. HTTP-Referrer
- 23. Entfernen von doppelten Tickets in Microstrategy basierend auf dem Arbeitsprotokolldatum
- 24. Get HTTP Referrer auf Umleitung
- 25. PHP Zugriff nur auf bestimmte Referrer-URL/Seite erlauben
- 26. Generieren von Ausgabe in Abfragezeichenfolge
- 27. Entfernen leerer Parameter in url von php
- 28. Wie Spoof-Referrer mit Curl und PHP?
- 29. Suchen und Entfernen von Ausreißern in PHP
- 30. jQuery sortierbare Abbrechen entfernen basierend auf Bestätigung
ist Ich bin nicht Sicher verstehe ich diese Frage. –
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. –
Sieht so aus, als ob Facebook Javascript dafür benutzt: http://stackoverflow.com/questions/824349/modify-the-url-without-reloading-the-page – Yarin