- PHP_SELF vs PATH_INFO против SCRIPT_NAME и REQUEST_URI
- Пример 1
- Остается такой же
- корень
- Дорожка
- Строка запроса
- Пример 2.
- Остается такой же
- корень
- Дорожка
- Строка запроса
- Пример 3.
- Остается такой же
- корень
- Дорожка
- язык
- Языковой путь
- Строка запроса языка
- Пути PHP
- где
- Порядок работы
- Php script name function
- User Contributed Notes
PHP_SELF vs PATH_INFO против SCRIPT_NAME и REQUEST_URI
Я создаю PHP-приложение в CodeIgniter. CodeIgniter отправляет все запросы на главный контроллер: index.php . Тем не менее, я не люблю видеть index.php в URI. Например, http://www.example.com/faq/whatever будет направлять на http://www.example.com/index.php/faq/whatever . Мне нужен надежный способ для скрипта узнать, что это за адрес, поэтому он будет знать, что делать с навигацией. Я использовал mod_rewrite , согласно документации CodeIgniter.
RewriteEngine on RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt) RewriteRule ^(.*)$ /index.php/$1 [L]
Обычно я просто проверял php_self , но в этом случае всегда index.php . Я могу получить его из REQUEST_URI , PATH_INFO и т. Д., Но я пытаюсь решить, какой из них будет наиболее надежным. Кто-нибудь знает (или знает, где найти) реальную разницу между PHP_SELF , PATH_INFO , SCRIPT_NAME и REQUEST_URI ? Спасибо за вашу помощь!
Примечание . Мне пришлось добавлять пробелы, так как SO видит символ подчеркивания и по какой-то причине делает его курсивом.
Обновлено : Исправлены пробелы.
Документация PHP может сказать вам разницу:
‘PHP_SELF’
Имя исполняемого скрипта, относящегося к корню документа. Например, $ _SERVER [‘PHP_SELF’] в скрипте по адресу http://example.com/test.php/foo.bar будет /test.php/foo.bar . Константа __FILE__ содержит полный путь и имя файла текущего (т.е. включенного) файла. Если PHP работает как процессор командной строки, эта переменная содержит имя скрипта с PHP 4.3.0. Раньше он не был доступен.
Содержит путь текущего скрипта. Это полезно для страниц, которые должны указывать на себя. Константа __FILE__ содержит полный путь и имя файла текущего (т.е. включенного) файла.
URI, который был предоставлен для доступа к этой странице; например, ‘/index.html’ .
PATH_INFO, похоже, не документируется …
Некоторые практические примеры различий между этими переменными:
Пример 1. PHP_SELF отличается от SCRIPT_NAME только тогда, когда запрашиваемый url находится в форме:
http://example.com/test.php/foo/bar
[PHP_SELF] => /test.php/foo/bar [SCRIPT_NAME] => /test.php
(это, по-видимому, единственный случай, когда PATH_INFO содержит разумную информацию [PATH_INFO] => / foo / bar). Примечание: в некоторых старых версиях PHP (
Пример 2. REQUEST_URI отличается от SCRIPT_NAME, когда вводится непустая строка запроса:
http://example.com/test.php?foo=bar
[SCRIPT_NAME] => /test.php [REQUEST_URI] => /test.php?foo=bar
Пример 3. REQUEST_URI отличается от SCRIPT_NAME, когда действует перенаправление на стороне сервера (например, mod_rewrite на apache):
[REQUEST_URI] => /test.php [SCRIPT_NAME] => /test2.php
Пример 4. REQUEST_URI отличается от SCRIPT_NAME при обработке ошибок HTTP со сценариями.
Использование директивы apache ErrorDocument 404 /404error.php
http://example.com/test.php
[REQUEST_URI] => /test.php [SCRIPT_NAME] => /404error.php
На сервере IIS с использованием настраиваемых страниц ошибок
http://example.com/test.php
[SCRIPT_NAME] => /404error.php [REQUEST_URI] => /404error.php?404;http://example.com/test.php
PATH_INFO доступен только при использовании htaccess:
Пример 1
RewriteCond % !-f RewriteCond % !-d RewriteCond % !^(favicon\.ico|robots\.txt) RewriteRule ^(.*)$ index.php/$1 [L]
Остается такой же
корень
[PHP_SELF] => /index.php [PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script) [REQUEST_URI] => / [QUERY_STRING] =>
Дорожка
[PHP_SELF] => /index.php/test [PATH_INFO] => /test [REQUEST_URI] => /test [QUERY_STRING] =>
Строка запроса
[PHP_SELF] => /index.php/test [PATH_INFO] => /test [REQUEST_URI] => /test?123 [QUERY_STRING] => 123
Пример 2.
RewriteCond % !-f RewriteCond % !-d RewriteCond % !^(favicon\.ico|robots\.txt) RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]
Остается такой же
[SCRIPT_NAME] => /index.php [PHP_SELF] => /index.php [PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
корень
[REQUEST_URI] => / [QUERY_STRING] =>
Дорожка
[REQUEST_URI] => /test [QUERY_STRING] => url=test
Строка запроса
[REQUEST_URI] => /test?123 [QUERY_STRING] => url=test&123
Пример 3.
RewriteCond % !-f RewriteCond % !-d RewriteCond % !^(favicon\.ico|robots\.txt) RewriteRule ^(([az])|(([az])/)?(.*))$ index.php/$5 [NC,L,E=LANGUAGE:$2$4]
RewriteRule ^([az])(/(.*))?$ $3 [NC,L,E=LANGUAGE:$1] RewriteCond % !-f RewriteCond % !-d RewriteCond % !^(favicon\.ico|robots\.txt) RewriteRule ^(.*)$ index.php/$1 [L]
Остается такой же
корень
[PHP_SELF] => /index.php [PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script) [REQUEST_URI] => / [QUERY_STRING] => [REDIRECT_LANGUAGE] IS NOT AVAILABLE
Дорожка
[PHP_SELF] => /index.php/test [PATH_INFO] => /test [REQUEST_URI] => /test [QUERY_STRING] => [REDIRECT_LANGUAGE] =>
язык
[PHP_SELF] => /index.php/ [PATH_INFO] => / [REQUEST_URI] => /en [QUERY_STRING] => [REDIRECT_LANGUAGE] => en
Языковой путь
[PHP_SELF] => /index.php/test [PATH_INFO] => /test [REQUEST_URI] => /en/test [REDIRECT_LANGUAGE] => en
Строка запроса языка
[PHP_SELF] => /index.php/test [PATH_INFO] => /test [REQUEST_URI] => /en/test?123 [QUERY_STRING] => 123 [REDIRECT_LANGUAGE] => en
Пути PHP
$_SERVER[‘REQUEST_URI’] = веб-путь, запрошенный URI
$_SERVER[‘PHP_SELF’] = веб-путь, запрошенный файл + информация о пути
$_SERVER[‘SCRIPT_NAME’] = веб-путь, запрошенный файл
$_SERVER[‘SCRIPT_FILENAME’] = Путь к файлу, запрошенный файл
__FILE__ = Путь к файлу, текущий файл
где
- Путь к файлу – это путь к системному файлу, например /var/www/index.php , после разрешения псевдонима
- Веб-путь – это путь к серверному документу, например /index.php из http://foo.com/index.php и даже не может соответствовать любому файлу
- Текущий файл означает включенный файл сценария , а не любой скрипт, который включает его
- Запрошенный файл означает файл сценария includeer , а не включенный
- URI – это HTTP-запрос, например /index.php?foo=bar , перед любой переписыванием URL-адресов
- Информация о пути – это любые дополнительные данные Apache, расположенные после имени сценария, но до строки запроса
Порядок работы
- Клиент отправляет сервер HTTP-запрос REQUEST_URI
- Сервер выполняет любые перезаписи URL из файлов .htaccess и т. Д., Чтобы получить PHP_SELF
- Сервер отделяет PHP_SELF SCRIPT_FILENAME + PATH_INFO
- Сервер выполняет разрешение псевдонима и преобразует весь URL-адрес в путь к системному файлу, чтобы получить SCRIPT_FILENAME
- Результирующий файл сценария может содержать другие, где __FILE__ ссылается на путь к текущему файлу
Вы можете посмотреть в URI-класс и использовать $ this-> uri-> uri_string ()
Возвращает строку с полным URI.
Например, если это ваш полный URL:
http://example.com/index.php/news/local/345
Или вы можете использовать сегменты для развертки определенных областей, не прибегая к значениям синтаксического анализа / регулярного выражения
Лично я использую $REQUEST_URI поскольку он ссылается на введенный URI, а не на место на диске сервера.
В ответ Одина очень мало добавить. Я просто хотел представить полный пример из HTTP-запроса в фактический файл в файловой системе, чтобы проиллюстрировать последствия перезаписи URL-адресов и псевдонимов. В файловой системе скрипт /var/www/test/php/script.php
"; echo "PHP_SELF: " . $_SERVER['PHP_SELF'] . "
"; echo "QUERY_STRING: " . $_SERVER['QUERY_STRING'] . "
"; echo "SCRIPT_NAME: " . $_SERVER['SCRIPT_NAME'] . "
"; echo "PATH_INFO: " . $_SERVER['PATH_INFO'] . "
"; echo "SCRIPT_FILENAME: " . $_SERVER['SCRIPT_FILENAME'] . "
"; echo "__FILE__ : " . __FILE__ . "
"; ?>
RewriteEngine On RewriteRule before_rewrite/script.php/path/(.*) after_rewrite/script.php/path/$1
и файл конфигурации Apache включает псевдоним
Alias /test/after_rewrite/ /var/www/test/php/
www.example.com/test/before_rewrite/script.php/path/info?q=helloword
REQUEST_URI: /test/before_rewrite/script.php/path/info?q=helloword PHP_SELF: /test/after_rewrite/script.php/path/info QUERY_STRING: q=helloword SCRIPT_NAME: /test/after_rewrite/script.php PATH_INFO: /path/info SCRIPT_FILENAME: /var/www/test/php/script.php __FILE__ : /var/www/test/php/script_included.php
Следующее всегда выполняется
PHP_SELF = SCRIPT_NAME + PATH_INFO = full url path between domain and query string.
Если нет mod_rewrite, mod_dir, перезаписи ErrorDocument или любой формы перезаписи URL-адресов, мы также имеем
REQUEST_URI = PHP_SELF + ? + QUERY_STRING
SCRIPT_FILENAME влияют на пути к системным файлам SCRIPT_FILENAME и __FILE__ , а не пути URL, которые определены ранее – см. Исключения ниже. Псевдонимы могут использовать весь путь URL, включая PATH_INFO . Между SCRIPT_NAME и SCRIPT_FILENAME не может быть никакой связи.
Не совсем точно, что псевдонимы не разрешены во время определения URL-адреса [PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO] , потому что считается, что псевдонимы ищут файловую систему, и мы знаем из примера 4 в ответе Одина, что поиск файловой системы, чтобы определить, существует ли файл, но это актуально только тогда, когда файл не найден. Аналогично, mod_dir вызывает mod_alias для поиска файловой системы, но это имеет смысл только в том случае, если у вас есть псевдоним, такой как Alias \index.php \var\www\index.php а uri запроса – это каталог.
Резервное копирование в секунду, с самого начала вы использовали неправильный подход. Почему бы просто не сделать это
RewriteEngine on RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt) RewriteRule ^(.*)$ /index.php?url=$1 [L]
вместо? Затем возьмите его с $_GET[‘url’];
Php script name function
A function may be defined using syntax such as the following:
Example #1 Pseudo code to demonstrate function uses
Any valid PHP code may appear inside a function, even other functions and class definitions.
Function names follow the same rules as other labels in PHP. A valid function name starts with a letter or underscore, followed by any number of letters, numbers, or underscores. As a regular expression, it would be expressed thus: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$ .
Functions need not be defined before they are referenced, except when a function is conditionally defined as shown in the two examples below.
When a function is defined in a conditional manner such as the two examples shown. Its definition must be processed prior to being called.
Example #2 Conditional functions
/* We can’t call foo() from here
since it doesn’t exist yet,
but we can call bar() */
if ( $makefoo ) function foo ()
echo «I don’t exist until program execution reaches me.\n» ;
>
>
/* Now we can safely call foo()
since $makefoo evaluated to true */
function bar ()
echo «I exist immediately upon program start.\n» ;
>
Example #3 Functions within functions
function foo ()
function bar ()
echo «I don’t exist until foo() is called.\n» ;
>
>
?php
/* We can’t call bar() yet
since it doesn’t exist. */
/* Now we can call bar(),
foo()’s processing has
made it accessible. */
All functions and classes in PHP have the global scope — they can be called outside a function even if they were defined inside and vice versa.
PHP does not support function overloading, nor is it possible to undefine or redefine previously-declared functions.
Note: Function names are case-insensitive for the ASCII characters A to Z , though it is usually good form to call functions as they appear in their declaration.
Both variable number of arguments and default arguments are supported in functions. See also the function references for func_num_args() , func_get_arg() , and func_get_args() for more information.
It is possible to call recursive functions in PHP.
Example #4 Recursive functions
Note: Recursive function/method calls with over 100-200 recursion levels can smash the stack and cause a termination of the current script. Especially, infinite recursion is considered a programming error.