web-dev-qa-db-fra.com

Requête de chaîne sans arguments GET dans PHP

Existe-t-il un moyen simple d’obtenir le fichier ou le répertoire demandé sans les arguments GET? Par exemple, si l'URL est http://mysite.com/directory/file.php?paramater=value, j'aimerais renvoyer uniquement http://mysite.com/directory/file.php. J'ai été surpris qu'il n'y ait pas un index simple dans $_SERVER[]. En ai-je manqué un? Merci!

34
Nathan

Vous pouvez utiliser $_SERVER['REQUEST_URI'] pour obtenir le chemin demandé. Ensuite, vous devrez supprimer les paramètres ...

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

Ajoutez ensuite le nom d'hôte et le protocole.

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

Notez que vous devrez également détecter le protocole si vous mélangez http: et https://. Que je laisse comme un exercice pour vous.

45
Brad

Edit: @ T.Todua a fourni une réponse plus récente à cette question en utilisant parse_url.

(s'il vous plaît upvote cette réponse afin qu'il puisse être plus visible).

parse_url solution

La solution la plus simple serait:

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

Parse_url est une fonction php intégrée dont le seul but est d'extraire des composants spécifiques d'une url, y compris la PATH (tout ce qui se trouve avant le premier ?). En tant que tel, c’est ma nouvelle "meilleure" solution à ce problème.

strtok solution

Stackoverflow: Comment supprimer la chaîne de requête et obtenir uniquement l'URL?

Vous pouvez utiliser strtok pour obtenir une chaîne avant la première occurrence de?

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

Performance Remarque: Ce problème peut également être résolu à l'aide de explode .

  • Éclater a tendance à être plus efficace dans les cas où le fractionnement du sring est limité à un seul délimiteur.
  • Strtok a tendance à mieux fonctionner dans les cas où plusieurs délimiteurs sont utilisés.

Cette application de strtok pour renvoyer tous les éléments d'une chaîne avant la première instance d'un caractère fonctionnera mieux que toute autre méthode en PHP, même si elle laissera la chaîne de requête en mémoire. 

64
Tony Chiboucas

Solution:

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

31
T.Todua

Je pense en fait que ce n'est pas la bonne façon de l'analyser. Ce n'est pas propre ou c'est un peu hors sujet ... 

  • Explode est lourd
  • La session est lourde
  • PHP_SELF ne gère pas l'URLRewriting

Je ferais quelque chose comme ...

if ($pos_get = strpos($app_uri, '?')) $app_uri = substr($app_uri, 0, $pos_get);
  • Cela détecte s'il y a un '?' (Format standard GET)
  • Si ça va, ça coupe notre variable avant le '?' qui est réservé à l'obtention des données

Considérant que $ app_uri est l’URI/URL de mon site Web. Vous êtes les bienvenus.

3
Laurent

Voici une solution qui prend en compte différents ports et https:

$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'];  

Ou une solution plus basique qui ne prend pas en compte les autres ports:

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

Vous pouvez utiliser $_GET pour les paramètres d'URL ou $_POST pour les paramètres de publication, mais le $_REQUEST contient les paramètres de $_GET$_POST et de $_COOKIE. Si vous souhaitez masquer le paramètre URI de l'utilisateur, vous pouvez le convertir en une variable de session, comme suit:

<?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>

MODIFIER 

utilisez $_SERVER['PHP_SELF'] pour obtenir le nom du fichier actuel ou $_SERVER['REQUEST_URI'] pour obtenir l'URI demandé

1
JKirchartz

Tout le monde ne trouvera pas cela simple, mais je pense que c'est la meilleure façon de le contourner:

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


Ce que fait est simplement de parcourir le REQUEST_URI depuis le début de la chaîne, puis de s’arrêter quand il frappe un "?" (ce qui ne devrait vraiment arriver que lorsque vous arrivez aux paramètres).

Ensuite, vous créez l'URL et enregistrez-le dans $ url:
Lors de la création de l'URL $ ... Ce que nous faisons est simplement d'écrire "http", puis de vérifier si https est utilisé. Si c'est le cas, nous écrivons également "s", puis nous concaténons ": //", concaténer le HTTP_Host (le serveur, fx: "stackoverflow.com"), et concaténer le $ return, que nous avons trouvé auparavant, à cela (c'est un tableau, mais nous voulons seulement le premier index qu'il contient ... Il ne peut que jamais être un index, puisque nous vérifions depuis le début de la chaîne dans la regex.).

J'espère que quelqu'un pourra utiliser ça ...

PS. Cela a été confirmé pour fonctionner tout en utilisant SLIM pour rediriger l'URL.

0
RasmusLD

Je sais que c'est un ancien message, mais j'ai le même problème et je l'ai résolu de cette façon.

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

Ou équivalent

$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

Pourquoi si compliqué? =)

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

cela devrait vraiment le faire l'homme;)

0
androidavid