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

Строка запроса без аргументов GET

Есть ли простой способ получить запрошенный файл или каталог без аргументов GET? Например, если URL-адрес http://example.com/directory/file.php?paramater=value, я хотел бы вернуть просто http://example.com/directory/file.php. Я был удивлен, что в $_SERVER[] нет простого индекса. Я пропустил один?

4b9b3361

Ответ 1

Вы можете использовать $_SERVER['REQUEST_URI'], чтобы получить запрошенный путь. Затем вам нужно удалить параметры...

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

Затем добавьте имя хоста и протокол.

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

Вам также нужно будет определить протокол, если вы смешаете http: и https://. Это я оставляю тебе как упражнение. $_SERVER['REQUEST_SCHEME'] возвращает протокол.


Собираем все вместе:

echo $_SERVER['REQUEST_SCHEME'] .'://'. $_SERVER['HTTP_HOST'] 
     . explode('?', $_SERVER['REQUEST_URI'], 2)[0];

...returns, for example:

http://example.com/directory/file.php


Документация php.com:

  • $_SERVER - Информация о сервере и среде выполнения
  • explode - Разделить строку на строку
  • parse_url - разобрать URL и вернуть его компоненты (возможно, лучшее решение)

Ответ 2

Изменение: @T.Todua предоставил новый ответ на этот вопрос, используя parse_url.

(пожалуйста, подтвердите этот ответ, чтобы он был более заметным).

Edit2: кто-то спамил и редактировал информацию о извлечении схемы, поэтому я добавил это внизу.

parse_url решение

Самое простое решение:

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

Parse_url - это встроенная функция php, единственной целью которой является извлечение определенных компонентов из URL, включая PATH (все до первого ?). Таким образом, это мое новое "лучшее" решение этой проблемы.

strtok решение

fooobar.com/questions/45245/...

Вы можете использовать strtok, чтобы получить строку до первого появления?

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

Примечание о производительности: Эту проблему также можно решить с помощью explode.

  • Explode имеет тенденцию работать лучше в случаях, когда разделение строки выполняется только по одному разделителю.
  • Strtok имеет тенденцию работать лучше в случаях, когда используется несколько разделителей.

Это приложение strtok, которое возвращает все в строке перед первым экземпляром символа, будет работать лучше, чем любой другой метод в PHP, хотя БУДЕТ оставить строку запроса в памяти.

Отдельно о Scheme (http/https) и $_SERVER vars

Хотя ОП не спрашивал об этом, полагаю, стоит упомянуть: parse_url следует использовать для извлечения любого конкретного компонента из URL-адреса, см. документацию по этой функции:

parse_url($actual_link, PHP_URL_SCHEME); 

Следует отметить, что получение полного URL-адреса из запроса не является тривиальной задачей и имеет много последствий для безопасности. Переменные $_SERVER здесь ваши, но они ненадежные, так как конфиги apache/nginx, среды php и даже клиенты могут опускать или изменять эти переменные. Все это выходит за рамки этого вопроса, но оно было тщательно обсуждено:

fooobar.com/questions/11671/...

Важно отметить, что эти переменные $_SERVER заполняются во время выполнения, независимо от того, какой движок выполняет выполнение (/var/run/php/ или /etc/php/[version]/fpm/). Эти переменные передаются из ОС на веб-сервер (apache/nginx) в движок php и изменяются и исправляются на каждом шаге. Единственными такими переменными, на которые можно положиться, являются REQUEST_URI (потому что это требуется php) и перечисленные в RFC 3875 (см.: PHP: $ _SERVER), потому что они требуется от веб-серверов.

обратите внимание: спамить ссылки на ваши ответы на другие вопросы не в хорошем вкусе.

Ответ 3

Решение:

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

Ответ 4

Я на самом деле думаю, что это не хороший способ разобрать это. Это не чистый или немного не в тему...

  • Взорваться тяжело
  • Сессия тяжелая
  • PHP_SELF не обрабатывает перезапись URL

Я бы сделал что-то вроде...

if ($pos_get = strpos($app_uri, '?')) $app_uri = substr($app_uri, 0, $pos_get);
  • Это обнаруживает, есть ли фактическое '?' (ПОЛУЧИТЕ стандартный формат)
  • Если все в порядке, это обрезает нашу переменную перед '?' который зарезервирован для получения данных

Рассматривая $ app_uri как URI/URL моего сайта.

Ответ 5

Вот решение, которое учитывает разные порты и 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'];  

Или более базовое решение, которое не учитывает другие порты:

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

Ответ 6

Вы можете использовать $_GET для параметров url или $_POST для post params, но $_REQUEST содержит параметры из $_GET $_POST и $_COOKIE, если вы хотите скрыть параметр URI из пользователь может преобразовать его в переменную сеанса следующим образом:

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

используйте $_SERVER['PHP_SELF'], чтобы получить текущее имя файла или $_SERVER['REQUEST_URI'], чтобы получить запрошенный URI

Ответ 7

Почему так сложно? =)

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

это должно действительно сделать это человек;)

Ответ 8

Не каждый найдет это простым, но я считаю, что это лучший способ обойти его:

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


То, что происходит, это просто пройти через REQUEST_URI с начала строки, а затем остановиться, когда он попадет в "?" (что действительно, только должно произойти, когда вы добираетесь до параметров).

Затем вы создаете URL-адрес и сохраняете его до $url:
При создании $url... То, что мы делаем, просто пишет "http", а затем проверяет, используется ли https, если это так, мы также пишем "s", затем мы объединяем "://", объединяем HTTP_HOST (сервер, fx: "stackoverflow.com" ) и объединить возвращаемый нами $return, который мы обнаружили ранее, (это массив, но нам нужен только первый индекс в нем... Там может быть только один индекс, так как мы проверяем начало строки в регулярном выражении.).

Я надеюсь, что кто-то сможет использовать это...

PS. Это подтверждено, работая при использовании SLIM, чтобы перенаправить URL-адрес.

Ответ 9

Я знаю, что это старый пост, но у меня та же проблема, и я решил ее таким образом

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

Или эквивалентно

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

Ответ 10

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

Ответ 11

Это шокирует, что многие из этих утвержденных/принятых ответов являются неполными, поэтому они не отвечают на вопрос ОП после 7 лет!

  • Если вы находитесь на странице с URL-адресом, например: http://example.com/directory/file.php?paramater=value

  • ... и вы хотите вернуть просто: http://example.com/directory/file.php

  • затем используйте:

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

Ответ 12

У меня была такая же проблема, когда мне нужна ссылка на главную страницу. Я пробовал это, и он работал:

<a href="<?php echo $_SESSION['PHP_SELF']; ?>?">

Обратите внимание на вопросительный знак в конце. Я считаю, что говорит, что машина перестает думать от имени кодера:)