Есть ли у нас httphandlers в PHP, как у нас в ASP.Net - PullRequest
2 голосов
/ 04 мая 2011

В ASP.Net у нас есть Httphandlers, которые могут анализировать запрос и соответственно перенаправлять пользователя, в основном мы используем их для перезаписи URL и т. Д.

Хотелось бы знать, есть ли у нас такая функциональность и в PHP, если да, то пример, объясняющий это, будет очень полезен.

Например, если я запрашиваю файл изображения на каком-либо сервере, я бы хотел перенаправить его на какую-то страницу, если запрос от сервера x

Ответы [ 3 ]

3 голосов
/ 04 мая 2011

Если я правильно понимаю HTTPHandlers, это обычно делается с помощью хитрости. Очевидно, что любой запрос, поступающий на веб-сервер (IIS, Apache и т. Д.), Будет пытаться сопоставить файл.

GET /index.php   HTTP 1.1

Этот запрос достигнет файла index.php, PHP обработает этот файл, а затем ответ будет отправлен клиенту. Очевидно, что клиент увидит любой вывод PHP.

HTTPHandlers работают, просматривая входящий запрос и отображая этот запрос на сегмент кода (возможно, функцию), но он может позволить веб-серверу узнать, как клиент должен получить доступ к этому коду через конфигурацию.

Ниже приведен пример, заимствованный у Microsoft , который иллюстрирует сопоставление.

<httpHandlers>
     <add verb="*" path="*.sync" type="MyHandler.SyncHandler, MyHandler" />
</httpHandlers>

В PHP это можно сделать в два этапа. Во-первых, веб-сервер должен направить все запросы в один файл PHP. И, во-вторых, этот файл PHP должен направлять поток программы.

В Apache вы можете настроить бит маршрутизации с файлом .htaccess в корне вашего сайта. Этот пример перенаправит все, что не существует на диске, в index.php.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]

Оттуда PHP просто нужно знать, какой URL искал пользователь, и решить, что делать. Это можно сделать с помощью значения REQUEST_URI, переданного из Apache.

$_SERVER['REQUEST_URI'];

Итак, если пользователь запрашивает:

GET /profile/settings  HTTP 1.1

REQUEST_URI будет:

$url = $_SERVER['REQUEST_URI'];
echo $url; // => "/index.php/profile/settings"

Кроме того, человек может применить регулярное выражение к REQUEST_URI и переключаться между несколькими функциями для обработки запроса.

1 голос
/ 04 мая 2011

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

1 голос
/ 04 мая 2011

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

eg
header('Location: http://www.invalid.com/newpage.pgp');
exit; // make sure to exit or the script will keep executing

если вам нужен текущий URL и т. Д., Вам нужно будет запросить $ _SERVER var

попробуйте это и посмотрите, какую информацию вы можете получить с вашего сервера

var_dump($_SERVER);
...