Если я правильно понимаю 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
и переключаться между несколькими функциями для обработки запроса.