Есть ли простой способ получить запрошенный файл или каталог без аргументов GET? Например, если URL-адрес http://example.com/directory/file.php?paramater=value
, я хотел бы вернуть просто http://example.com/directory/file.php
. Я был удивлен, что в $_SERVER[]
нет простого индекса. Я пропустил один?
Строка запроса без аргументов GET
Ответ 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:
Ответ 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']; ?>?">
Обратите внимание на вопросительный знак в конце. Я считаю, что говорит, что машина перестает думать от имени кодера:)