Я создаю приложение 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 видит подчеркивание и почему-то делает его курсивом.
Обновлено : исправлены пробелы.
источник
Некоторые практические примеры различий между этими переменными:
Пример 1. PHP_SELF отличается от SCRIPT_NAME только тогда, когда запрошенный URL-адрес находится в форме:
http://example.com/test.php/foo/bar
(кажется, это единственный случай, когда PATH_INFO содержит разумную информацию [PATH_INFO] => / foo / bar) Примечание: раньше это было иначе в некоторых старых версиях PHP (<= 5.0?).
Пример 2. REQUEST_URI отличается от SCRIPT_NAME, когда вводится непустая строка запроса:
http://example.com/test.php?foo=bar
Пример 3. REQUEST_URI отличается от SCRIPT_NAME, когда действует перенаправление на стороне сервера (например, mod_rewrite на apache):
http://example.com/test.php
Пример 4. REQUEST_URI отличается от SCRIPT_NAME при обработке ошибок HTTP с помощью скриптов.
Использование директивы apache ErrorDocument 404 /404error.php
http://example.com/test.php
На сервере IIS с использованием настраиваемых страниц ошибок
http://example.com/test.php
источник
/
в конце файлаSCRIPT_NAME
. Это похоже на PHP 5.2-5.4, учитывая редактирование ответа, чтобы отразить это.PATH_INFO
доступен только при использовании htaccess следующим образом:Пример 1
Остается такой же
Корень
http://domain.com/
Дорожка
http://domain.com/test
Строка запроса
http://domain.com/test?123
Пример 2
Остается такой же
Корень
http://domain.com/
Дорожка
http://domain.com/test
Строка запроса
http://domain.com/test?123
Пример 3
или
Остается такой же
Корень
http://domain.com/
Дорожка
http://domain.com/test
Язык
http://domain.com/en
Языковой путь
http://domain.com/en/test
Строка языкового запроса
http://domain.com/en/test?123
источник
Пути 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
, и может даже не совпадать с каким-либо файлом/index.php?foo=bar
, до перезаписи URL-адреса.Порядок работы
REQUEST_URI
PHP_SELF
PHP_SELF
наSCRIPT_FILENAME
+PATH_INFO
SCRIPT_FILENAME
__FILE__
относится к пути к текущему файлу.источник
$_SERVER['SCRIPT_NAME']
и$_SERVER['PHP_SELF']
, поскольку mod_rewrite создает весь путь, то есть$_SERVER['PHP_SELF']
. Далее происходит разделение. Обратите внимание, что псевдонимы также учитывают весь путь для определения имени файла сценария, но разделение, которое определило имя_сценария и путь_инфо, уже произошло, поэтому они не будут затронуты.Вы можете изучить URI-класс и использовать $ this-> uri-> uri_string ()
Возвращает строку с полным URI.
Например, если это ваш полный URL:
Функция вернет это:
Или вы можете использовать сегменты для детализации определенных областей без необходимости придумывать значения синтаксического анализа / регулярного выражения.
источник
Лично я использую,
$REQUEST_URI
поскольку он ссылается на введенный URI, а не на расположение на диске сервера.источник
К ответу Одина добавить очень мало. Я просто хотел предоставить полный пример от HTTP-запроса к фактическому файлу в файловой системе, чтобы проиллюстрировать эффекты перезаписи URL-адресов и псевдонимов. В файловой системе сценарий
/var/www/test/php/script.php
являетсягде
/var/www/test/php/script_included.php
находитсяи
/var/www/test/.htaccess
этоа файл конфигурации Apache включает псевдоним
а HTTP-запрос
Выход будет
Всегда верно следующее
Если нет перезаписи mod_rewrite, mod_dir, ErrorDocument или любой формы перезаписи URL, у нас также есть
Псевдонимы влияют на пути к системным файлам,
SCRIPT_FILENAME
а__FILE__
не на пути URL, которые были определены ранее - см. Исключения ниже. Псевдонимы могут использовать весь URL-путь, включаяPATH_INFO
. Там не может быть никакой связи междуSCRIPT_NAME
иSCRIPT_FILENAME
.Не совсем точно, что псевдонимы не разрешаются во время определения пути URL
[PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO]
, потому что псевдонимы считаются для поиска в файловой системе, и из примера 4 в ответе Odin мы знаем, что в файловой системе выполняется поиск, чтобы определить, существует ли файл, но это актуально только тогда, когда файл не найден. Аналогично, mod_dir вызывает mod_alias для поиска в файловой системе, но это актуально только в том случае, если у вас есть псевдоним, например, аAlias \index.php \var\www\index.php
запрос uri - это каталог.источник
Если вы когда-нибудь забудете, какие переменные что делают, вы можете написать небольшой скрипт, который использует phpinfo () и вызывать его из URL-адреса со строкой запроса. Поскольку установки серверного программного обеспечения представляют переменные, которые возвращает PHP, всегда рекомендуется проверять вывод машины на случай, если перезапись в файле конфигурации сервера приведет к другим результатам, чем ожидалось. Сохраните это как-то вроде
_inf0.php
:Тогда вы бы позвонили
/_inf0.php?q=500
источник
Сделайте резервную копию секунды, вы изначально выбрали неправильный подход. Почему бы просто не сделать это
вместо? Затем возьмите его
$_GET['url'];
источник
QSA
флаг), то параметры строки запроса потенциально могут быть перезаписаны (например, если вам нуженurl
параметр в первоначальном запросе) или, что еще хуже, быть уязвимыми для атак XSS.