it-swarm.com.de

Fordern Sie die Zeichenfolge ohne GET-Argumente in an PHP

Gibt es eine einfache Möglichkeit, die angeforderte Datei oder das angeforderte Verzeichnis ohne die GET-Argumente abzurufen? Wenn die URL beispielsweise http://mysite.com/directory/file.php?paramater=value lautet, möchte ich nur http://mysite.com/directory/file.php zurückgeben. Ich war überrascht, dass es in $_SERVER[] keinen einfachen Index gibt. Habe ich einen vermisst? Vielen Dank!

34
Nathan

Sie können $_SERVER['REQUEST_URI'] verwenden, um den angeforderten Pfad abzurufen. Dann müssen Sie die Parameter entfernen ...

$uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2);

Fügen Sie dann den Hostnamen und das Protokoll hinzu.

echo 'http://' . $_SERVER['HTTP_Host'] . $uri_parts[0];

Beachten Sie, dass Sie auch das Protokoll erkennen müssen, wenn Sie http: und https:// mischen. Dass ich für dich eine Übung hinterlasse.

45
Brad

Edit: @ T.Todua lieferte eine neuere Antwort auf diese Frage mit parse_url.

(Bitte bestätigen Sie diese Antwort, damit sie besser sichtbar wird).

parse_url solution

Die einfachste Lösung wäre:

echo parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);

Parse_url ist eine integrierte PHP-Funktion, deren einziger Zweck es ist, bestimmte Komponenten aus einer URL zu extrahieren, einschließlich PATH (alles vor dem ersten ?). Als solche ist es meine neue "beste" Lösung für dieses Problem.

strtok lösung

Stackoverflow: Wie entferne ich den Querystring und bekomme nur die URL?

Sie können strtok verwenden, um den String vor dem ersten Auftreten von?

$url=strtok($_SERVER["REQUEST_URI"],'?');

Performance Hinweis: Dieses Problem kann auch mit explode gelöst werden.

  • Explodieren ist tendenziell besser für Fälle, in denen der Sring nur auf ein einzelnes Trennzeichen aufgeteilt wird.
  • Strtok ist tendenziell besser für Fälle, in denen mehrere Trennzeichen verwendet werden.

Diese Anwendung von strtok, um alles in einem String vor der ersten Instanz eines Zeichens zurückzugeben, wird bessere Ergebnisse erzielen als any andere Methode in PHP, obwohl WILL die Querzeichenfolge im Speicher belässt. 

64
Tony Chiboucas

Lösung:

echoparse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);

31
T.Todua

Ich denke eigentlich, dass das nicht der richtige Weg ist, um es zu analysieren. Es ist nicht sauber oder es ist ein bisschen außerhalb des Themas ... 

  • Explodieren ist schwer
  • Sitzung ist schwer
  • PHP_SELF behandelt URLRewriting nicht

Ich würde so etwas machen ...

if ($pos_get = strpos($app_uri, '?')) $app_uri = substr($app_uri, 0, $pos_get);
  • Dies erkennt, ob es ein tatsächliches "?" (GET Standardformat)
  • Wenn es in Ordnung ist, schneidet unsere Variable vor dem '?' was für das Abrufen von Daten reserviert ist

Betrachten Sie $ app_uri als URL/URL meiner Website. Bitte.

3
Laurent

Hier ist eine Lösung, die verschiedene Ports und https berücksichtigt:

$pageURL = (@$_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';

if ($_SERVER['SERVER_PORT'] != '80')
  $pageURL .= $_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['PHP_SELF'];
else 
  $pageURL .= $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'];  

Oder eine einfachere Lösung, die andere Ports nicht berücksichtigt:

$pageURL = (@$_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';
$pageURL .= $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; 
1
Ravean

Sie können $_GET für URL-Parameter oder $_POST für Post-Parameter verwenden, der $_REQUEST enthält jedoch die Parameter aus $_GET$_POST und $_COOKIE. Wenn Sie den URI-Parameter vor dem Benutzer ausblenden möchten, können Sie ihn wie folgt in eine Sitzungsvariable konvertieren:

<?php

session_start();
if (isset($_REQUEST['param']) && !isset($_SESSION['param'])) {

    // Store all parameters received
    $_SESSION['param'] = $_REQUEST['param'];

    // Redirect without URI parameters
    header('Location: /file.php');
    exit;
}
?>
<html>
<body>
<?php
  echo $_SESSION['param'];
?>
</body>
</html>

EDIT 

verwenden Sie $_SERVER['PHP_SELF'], um den aktuellen Dateinamen abzurufen, oder $_SERVER['REQUEST_URI'], um den angeforderten URI abzurufen

1
JKirchartz

Es ist schockierend, wie viele dieser überstimmten/akzeptierten Antworten unvollständig sind, sodass sie nach 7 Jahren die Frage des OP nicht beantworten!

  • Wenn Sie sich auf einer Seite mit einer URL wie der folgenden befinden: http://example.com/directory/file.php?paramater=value

  • ... und Sie möchten nur zurückkehren: http://example.com/directory/file.php

  • dann benutze:

    echo $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'];

1
ashleedawg

Nicht jeder wird es einfach finden, aber ich glaube, dass dies der beste Weg ist, um es zu umgehen:

preg_match('/^[^\?]+/', $_SERVER['REQUEST_URI'], $return);
$url = 'http' . ('on' === $_SERVER['HTTPS'] ? 's' : '') . '://' . $_SERVER['HTTP_Host'] . $return[0]


Was bedeutet, dass Sie einfach REQUEST_URI vom Anfang der Zeichenfolge durchgehen und dann anhalten, wenn es ein "?" (was wirklich nur passieren sollte, wenn Sie Parameter erreichen).

Dann erstellen Sie die URL und speichern sie unter $ url:
Beim Erstellen des $ url ... schreiben wir einfach "http" und prüfen, ob https verwendet wird. Wenn dies der Fall ist, schreiben wir auch "s". Dann verketten wir ": //". Verketten Sie den HTTP_Host (den Server, fx: "stackoverflow.com") und verketten Sie den $ return, den wir zuvor gefunden haben, dazu (dies ist ein Array, aber wir wollen nur den ersten Index darin ... Es kann nur immer ein Index sein, da wir vom Anfang des Strings in der Regex prüfen.).

Ich hoffe jemand kann das nutzen ...

PS. Dies wurde bestätigt, um zu funktionieren, während SLIM verwendet wird, um die URL umzuleiten.

0
RasmusLD

Ich weiß, das ist ein alter Beitrag, aber ich habe das gleiche Problem und habe es auf diese Weise gelöst

$current_request = preg_replace("/\?.*$/","",$_SERVER["REQUEST_URI"]);

Oder gleichwertig

$current_request = preg_replace("/\?.*/D","",$_SERVER["REQUEST_URI"]);
0
user5379368
$uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2);
$request_uri = $uri_parts[0];
echo $request_uri;
0
mahfuz

Warum so kompliziert? =)

$baseurl = 'http://mysite.com';
$url_without_get = $baseurl.$_SERVER['PHP_SELF'];

das sollte es wirklich mann tun;)

0
androidavid