Есть ли простой способ получить запрошенный файл или каталог без аргументов GET? Например, если URL-адрес: http://mysite.com/directory/file.php?paramater=value
я хотел бы вернуть только http://mysite.com/directory/file.php
. Я был удивлен, что в $_SERVER[]
нет простого индекса. Я пропустил один? Благодаря!
Вы можете использовать $_SERVER['REQUEST_URI']
чтобы получить запрошенный путь. Затем вам нужно удалить параметры …
$uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2);
Затем добавьте имя хоста и протокол.
echo 'http://' . $_SERVER['HTTP_HOST'] . $uri_parts[0];
Обратите внимание, что вам также придется обнаруживать протокол, если вы смешиваете http:
и https://
. Это я оставляю для вас упражнение.
Лучший ответ здесь – от RiaD :
Stackoverflow: как удалить запрос и получить только URL?
Вы можете использовать strtok для получения строки до первого появления?
$url=strtok($_SERVER["REQUEST_URI"],'?');
Замечание по производительности. Эта проблема также может быть решена с помощью взрыва .
Это приложение strtok для возврата всего в строку до первого экземпляра символа будет работать лучше, чем любой другой метод в PHP, хотя WILL оставит запрос в памяти.
Самое простое решение:
echo
parse_url
($_SERVER["REQUEST_URI"], PHP_URL_PATH);
Я на самом деле думаю, что это не лучший способ разобрать его. Это не чисто или немного из-за темы …
Я бы сделал что-то вроде …
if ($pos_get = strpos($app_uri, '?')) $app_uri = substr($app_uri, 0, $pos_get);
Учитывая $ app_uri как URI / URL моего сайта. Пожалуйста.
Вы можете использовать $_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>
РЕДАКТИРОВАТЬ
используйте $_SERVER['PHP_SELF']
чтобы получить текущее имя файла или $_SERVER['REQUEST_URI']
чтобы получить запрошенный URI
Почему так сложно? знак равно
$baseurl = 'http://mysite.com'; $url_without_get = $baseurl.$_SERVER['PHP_SELF'];
это должно действительно сделать это человек;)
Вот решение, которое учитывает разные порты и 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'];
Не всем это будет просто, но я считаю, что это лучший способ обойти это:
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-адрес.
У меня была такая же проблема, когда мне нужна ссылка на домашнюю страницу. Я пробовал это, и это сработало:
<a href="<?php echo $_SESSION['PHP_SELF']; ?>?">
Обратите внимание на знак вопроса в конце. Я считаю, что говорит, что машина перестает думать от имени кодера 🙂