Как определить запрашиваемую страницу в PHP

Есть ли простой способ идентифицировать файл, первоначально обрабатывающий запрос, игнорируя аргументы и управляющие (по крайней мере основные) сопоставления, такие как / to /index.php ?

Идеально, что я ищу, это что-то вроде $_SERVER['REQUEST_URI'] , за исключением того, что оно возвращает одно и то же значение независимо от аргументов get, и это значение является запрошенным файлом, а не URI или исполняемым файлом ( $_SERVER['PHP_SELF'] ). Другими словами, $_SERVER['REQUESTED_FILE'] или что-то в этом роде. Я не видел ничего подобного. Он существует, или мне нужно написать что-то вручную?

Обновление Вот некоторые примеры URL-адресов в паре с тем, что я хотел бы получить:

 example.com/mypage.php : /mypage.php example.com/ : /index.php example.com/foo/?hello=world : /foo/index.php 

И эти возвращаемые значения верны даже во включенных файлах. См. Мой ответ ниже, прежде чем отвечать, я думаю, что нашел то, что искал.

Solutions Collecting From Web of "Как определить запрашиваемую страницу в PHP"

Я решил проверить это сам. Переменная $_SERVER['SCRIPT_NAME'] обслуживает путь к запрашиваемому файлу, даже если это индексный файл, и без параметров или чего-либо еще. В документации по PHP указано, что это путь к файлу, но он, по-видимому, относится к корню документа, как и PHP_SELF , но без уязвимости безопасности.

Вот код, который я использовал для проверки этого: https://gist.github.com/dimo414/5484870

Вывод при запросе example.com/?foo=bar :

 __FILE__: /var/www/index.php PHP_SELF: /index.php SCRIPT_NAME: /index.php REQUEST_URI: /?foo=bar parse_url(REQUEST_URI): / __FILE__: /var/www/pathtest.php PHP_SELF: /index.php SCRIPT_NAME: /index.php REQUEST_URI: /?foo=bar parse_url(REQUEST_URI): / 

И вывод при запросе example.com/index.php/<strong>XSS</strong> :

 __FILE__: /var/www/index.php PHP_SELF: /index.php/XSS # note the XSS exploit (this is bold in browser) SCRIPT_NAME: /index.php # No exploit here REQUEST_URI: /index.php/%3Cstrong%3EXSS%3C/strong%3E parse_url(REQUEST_URI): /index.php/%3Cstrong%3EXSS%3C/strong%3E __FILE__: /var/www/pathtest.php PHP_SELF: /index.php/XSS SCRIPT_NAME: /index.php REQUEST_URI: /index.php/%3Cstrong%3EXSS%3C/strong%3E parse_url(REQUEST_URI): /index.php/%3Cstrong%3EXSS%3C/strong%3E 

Как вы можете видеть, $_SERVER['SCRIPT_NAME'] всегда возвращает файл, который первоначально обрабатывал запрос, то есть файл в URL, без каких-либо рисков XSS.

 $_SERVER['PHP_SELF'] 

Должен вернуть фактический скрипт. Но существуют различные методы .

У меня была лучшая ссылка на матрицу из всех переменных среды, связанных с файлами, но я не могу ее найти. Я отредактирую, если он появится.

Изменить: я нашел хороший поток SO, который детализирует различия между ними .

  1. parse_url($_SERVER['REQUEST_URI']) а затем pathinfo($path) чтобы получить запрашиваемое имя файла
  2. $_SERVER['PHP_SELF'] чтобы получить реальное имя файла
  3. $_SERVER['SCRIPT_NAME'] чтобы получить реальное имя файла

Его очень старый вопрос и не очень ясный. Я понял, что вы хотите знать, какая страница отправляет запрос GET / POST. Это может быть реализовано путем:

$ _SERVER [ 'HTTP_REFERER']

Теперь, чтобы получить фактическое имя страницы, напишите как: = basename ($ _ SERVER ['HTTP_REFERER']);

Это решит вас.

Пойдите, чтобы получить имя файла из запрошенного URL, используйте следующий код.

 basename($_SERVER['URL']); basename($_SERVER['REQUEST_URI']); basename($_SERVER['SCRIPT_NAME']); basename($_SERVER['SCRIPT_FILENAME']); basename($_SERVER['REQUEST_URI']); basename($_SERVER['PATH_TRANSLATED']); basename($_SERVER['PHP_SELF']); 

используйте любой из всех тех, кто находится в состоянии вложенного if, чтобы вы не пропустили имя файла каким-либо образом.