Я ищу портативный способ получить (удобный) $_SERVER['PATH_INFO']
переменная.
После чтения некоторое время, это складывается PATH_INFO
порождается из CGI/1.1 и моего не всегда присутствовать во всей конфигурации.
Что лучший (главным образом мудрый безопасностью) путь состоит в том, чтобы получить ту переменную - кроме извлечения его вручную (проблема безопасности).
Well, I'm (almost) sure that without making use of the $_SERVER
superglobal keys, providing a alternative way to figure out PATH_INFO
is just impossible, that being said lets first list all of the $_SERVER keys that we may possibly use:
We obviously need to ignore the last two. Now we should (I don't know this for a fact, I'm just assuming because you said so) filter all the keys that exist in the link you provided (which BTW is offline ATM), that leaves us with the following keys:
Regarding your comment to Anthonys answer:
You are just juggling variables now.
SCRIPT_FILENAME
является частью CGI спец. Он не будет доступен, еслиPATH_INFO
недоступен. Что касаетсяREQUEST_URI
, это mod_rewrite apache конкретный. - LiraNuna
Я использую LightTPD / 1.4.20-1 (Win32) с PHP 5.3.0 в качестве CGI, cgi.fix_pathinfo = 1
и $ _ SERVER ['REQUEST_URI ']
очень доступен для меня , я также помню, как использовал ту же самую переменную в те дни, когда никто не использовал mod_rewrite
, так что мое честное скромное предположение состоит в том, что вы простой неверно в этом пункте . Что касается ключа SCRIPT_FILENAME
, я не могу проверить этот банкомат. Тем не менее, если мы очень сильно закроем глаза и поверим, что вы правы, у нас останется только одна переменная:
I '
Вы также должны прочитать это о том, почему бы не использовать PHP_SELF
.
Если это не сработает для вас, извините, но я могу придумать что-нибудь еще.
EDIT - Еще кое-что для вас:
REQUEST_URI
специфичен для Apache?) PHP_SELF
vs PATH_INFO
vs SCRIPT_NAME
vs REQUEST_URI
вы можете попробовать
$_ENV['PATH_INFO']; or
getenv('PATH_INFO'];
function getPathInfo() {
if (isset($_SERVER['PATH_INFO'])) {
return $_SERVER['PATH_INFO'];
}
$scriptname = preg_quote($_SERVER["SCRIPT_NAME"], '/');
$pathinfo = preg_replace("/^$scriptname/", "", $_SERVER["PHP_SELF"]);
return $pathinfo;
}
Править: без SCRIPT_NAME и при условии, что у вас есть DOCUMENT_ROOT (или вы можете определить / обнаружить его самостоятельно) и, если у вас есть SCRIPT_FILENAME, тогда:
function getPathInfo() {
if (isset($_SERVER['PATH_INFO'])) {
return $_SERVER['PATH_INFO'];
}
$docroot = preg_quote($_SERVER["DOCUMENT_ROOT"], "/");
$scriptname = preg_replace("/^$docroot/", "", $_SERVER["SCRIPT_FILENAME"]);
$scriptname = preg_quote($scriptname, "/");
$pathinfo = preg_replace("/^$scriptname/", "", $_SERVER["PHP_SELF"]);
return $pathinfo;
}
Также @ Anthony (недостаточно репутации для комментариев, извините): использование str_replace () будет соответствовать любому месту в строке. Это' s не гарантированно работает, вы хотите сопоставить его только в начале. Кроме того, ваш метод возврата только на 1 косую черту (через strrpos) для определения SCRIPT_NAME будет работать только в том случае, если сценарий находится в корневом каталоге, поэтому лучше сравнивать имя_файла_сценария с docroot.
Я не видел комментариев или ссылок перед публикацией. Вот кое-что, что может сработать, исходя из того, что указанная выше страница дает переменные, производные от CGI:
function getPathInfo() {
if (isset($_SERVER['PATH_INFO'])) {
return $_SERVER['PATH_INFO'];
}
$script_filename = $_SERVER["SCRIPT_FILENAME"];
$script_name_start = strrpos($script_filename, "/");
$script_name = substr($script_filename, $script_name_start);
//With the above you should have the plain file name of script without path
$script_uri = $_SERVER["REQUEST_URI"];
$script_name_length = strlen($script_name);
$path_start = $script_name_length + strpos($script_name, $script_uri);
//You now have the position of where the script name ends in REQUEST_URI
$pathinfo = substr($script_uri, $path_start);
return $pathinfo;
}
Это зависит от определений "переносимый" и "безопасный".
Позвольте мне проверить, правильно ли я понял:
1) Вас не интересует CLI:
2) Вы хотите иметь PATH_INFO во всех комбинациях ОС + HTTP сервер + PHP:
Хммм... PHP_INFO, в массиве $_SERVER, предоставляется PHP исполняемому скрипту только при определенных условиях, в зависимости от вышеупомянутого программного обеспечения. Он не всегда доступен. То же самое относится и ко всему массиву $_SERVER!
Короче говоря: "$_SERVER зависит от сервера"... поэтому переносимое решение не может зависеть от $_SERVER... (просто для примера: у нас есть учебник по настройке переменных PHP/CGI $_SERVER на HTTP-сервере NginX на kbeezie. com/view/php-self-path-nginx/)
3) Несмотря на то, что было сказано выше, стоит упомянуть, что если у нас каким-то образом есть полный URL, который был запрошен, доступный в виде строки, можно получить PATH_INFO из него, применяя регулярные выражения и другие строковые функции PHP, безопасно (также проверяя входную строку как правильный URI).
Итак, если у нас есть строка URL... то ДА, у нас есть переносимый и безопасный способ определения PATH_INFO из нее.
Теперь у нас есть два четких и сфокусированных вопроса реализации:
Среди нескольких возможностей, вот возможный подход:
1) Имея глубокие и всесторонние знания о каждой комбинации HTTP-сервер + ОС + версия PHP, проверьте и попробуйте каждую возможность получения URL из массива $_SERVER (проверьте 'PHP_SELF', 'QUERY_STRING', 'SCRIPT_FILENAME', 'PATH_TRANSLATED', 'SCRIPT_NAME', 'REQUEST_URI', 'PATH_INFO', 'ORIG_PATH_INFO', 'HTTP_HOST', 'DOCUMENT_ROOT' или что-то еще)
2) Если предыдущий шаг не удался, заставьте PHP-скрипт вернуть javascript-код, который отправляет "document. URL" информацию обратно. (Проблема переносимости переносится на сторону клиента.)
Это мое скромное мнение и подход к проблеме.
Что вы думаете?