Как определить запрашиваемую страницу в PHP - PullRequest
17 голосов
/ 11 июня 2009

Есть ли простой способ идентифицировать файл, первоначально обрабатывающий запрос, игнорируя аргументы get и обрабатывая (хотя бы базовые) сопоставления, такие как / 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

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

Ответы [ 5 ]

26 голосов
/ 12 июня 2009

Я решил проверить это сам. Переменная $_SERVER['SCRIPT_NAME'] предоставляет путь к запрашиваемому файлу, даже если это индексный файл, без параметров get или чего-либо еще. В документации 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.

6 голосов
/ 11 июня 2009
$_SERVER['PHP_SELF']

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

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

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

1 голос
/ 18 ноября 2016

Для получения имени файла с запрошенного 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, чтобы не пропустить ни одного имени файла.

0 голосов
/ 12 апреля 2016

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

$ _ SERVER ['HTTP_REFERER']

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

Это решит вашу проблему.

0 голосов
/ 11 июня 2009
  1. parse_url($_SERVER['REQUEST_URI']), а затем pathinfo($path), чтобы получить запрошенное имя файла
  2. $_SERVER['PHP_SELF'] чтобы получить реальное имя файла
  3. $_SERVER['SCRIPT_NAME'] чтобы получить реальное имя файла
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...