PHP GET переменная `/` вместо `?` - PullRequest
3 голосов
/ 30 ноября 2011

Я работаю со сценарием, который не допускает переменные $_GET[] в URL (это URL-адрес реферера, который я выдаю, и мне нужен какой-то способ его отслеживания). Я не могу иметь это, например, domain.com/index.php?id=test. Однако я могу сделать это domain.com/index.php/idd=test

Мой вопрос, если я использую / вместо ? и отношусь к нему как к переменной get. Как мне получить переменную из URL. Какой простой способ сделать это

Ответы [ 5 ]

4 голосов
/ 30 ноября 2011

Если у вас есть такой URL:

http://example.com/index.php/whatever

Тогда /whatever обычно известен как PATH_INFO и доступен как:

print $_SERVER["PATH_INFO"]

Обратите внимание, что в некоторых средах (CGI) он может иметь значения заполнителя (request_uri), когда отсутствует фактическая path_info. (См. Также руководство по PHP для переменных среды http://php.net/manual/en/reserved.variables.server.php и примечания о PATH_INFO и PATH_TRANSLATED.)

.htaccess: php_value arg_separator.input &;/
# Else strtr(..., "/", "&")

parse_str($_SERVER["PATH_INFO"], $_GET);

Заполнить $ _GET.

2 голосов
/ 30 ноября 2011

Не существует "простого" способа заменить всю функциональность параметров $ _GET, но есть некоторые неуклюжие хаки, по крайней мере, под Apache. Учитывая, что вы не можете использовать параметры $ _GET, я предполагаю, что у вас также нет доступа к mod_rewrite, но кто знает.

запрос типа http://www.example.com/index.php/foo/bar/baz сгенерирует следующие элементы в суперглобальном символе $ _SERVER:

[REQUEST_URI] => /index.php/foo/bar/baz
[SCRIPT_NAME] => /index.php
[PATH_INFO] => /foo/bar/baz

Теоретически, вы можете затем проанализировать $ _SERVER ['PATH_INFO'], разделив "/", пройдя по этому массиву и разделив "=" (при условии, что вы все еще собираетесь использовать структуру ключ = значение).

Имейте в виду, однако, что побочным эффектом структуры URL-адресов Wickky является то, что относительные ссылки в вашем документе станут относительными к URL-адресам Wonky, поэтому изображение, подобное

<img src="images/myimage.jpg">

попытается загрузить http://www.example.com/index.php/foo/bar/images/myimage.jpg

Этого можно избежать, используя абсолютные URL-адреса (http://www.example.com/images/myimage.jpg) или корневые URL-адреса (/images/myimage.jpg).

Но, по сути, вы просите мир проблем ... и устранения неполадок.

1 голос
/ 30 ноября 2011

Вы можете разобрать это так:

$uriParts = array_reverse((array) explode('/', $_SERVER['REQUEST_URI']));
$GET = explode('=', $uriParts[0]); // however you wanted to parse it form here

Делайте с этим, как хотите, просто знайте, что $uriParts[0] будет содержать id=whatever.

1 голос
/ 30 ноября 2011

Что вам нужно сделать, это разобрать $_SERVER['REQUEST_URI'] и затем сделать то, что вам нужно.

из вашего примера вам нужно что-то вроде этого:

//get rid of "/index.php
$uri = substr($_SERVER['REQUEST_URI'], 11);
//explode incase there are other parameters
$arr = explode('&', $uri);
$token = array();
foreach($token as $t){
    $part = explode('=', $t);
    $token[$part[0]] = $part[1]
}
1 голос
/ 30 ноября 2011
$segments = explode("/", $_SERVER['REQUEST_URI']);

тогда вы решите оттуда.каждый из результатов из $ сегментов можно манипулировать одинаково.Вы можете выбрать id = test или просто id и всегда знать, например, что $ сегменты [2] - это id.Ваш звонок.

Вы обязательно должны посмотреть на mod_rewrite.вам нужно перенаправить вызовы в файл, потому что этот метод не пропустит ничего за .php, если вам не разрешено получать переменные.(при условии, что через некоторые настройки? и далее не читается)

в основном перенаправляет все в index.php, если это ваш единственный контроллер.

...