URL-сопоставление в PHP? - PullRequest
       14

URL-сопоставление в PHP?

19 голосов
/ 28 декабря 2008

Я пришел из Java-фона и с любой технологией, основанной на сервлетах, тривиально отобразить диапазон URL-адресов (например, / reports / , /secure/.do) на указанный сервлет. Теперь я менее знаком с PHP, но я еще не видел ничего такого, что бы делало то же самое с PHP (или mod_php). Вполне возможно, что мне не хватает чего-то простого.

Как вы делаете это в PHP?

Одна из причин, по которой я хочу это сделать, - это одноразовые URL. Теперь это можно сделать с помощью параметров GET (например, хеш-токена MD5), но меня интересует сопоставление URL-адресов как общее решение многих проблем.

Еще одна важная причина использовать что-то вроде этого - иметь RESTful URL.

Ответы [ 7 ]

23 голосов
/ 28 декабря 2008

С Apache вы можете настроить перезапись URL для ваших php-страниц с помощью mod_rewrite, проверьте следующие ресурсы:

13 голосов
/ 28 декабря 2008

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

Вставьте в .htaccess директиву, подобную этой

<FilesMatch "^servlet$"> 
  ForceType application/x-httpd-php
</FilesMatch> 

замените ^ servlet $ регулярным выражением по вашему выбору (это будет имя вашего диспетчера)

Файловый сервлет должен быть похож на этот

<?php
  $data = explode('/',$HTTP_SERVER_VARS['PATH_INFO']); // $data[0] always empty
  $fileToInclude = $data[1].'.php';
  if (file_exists($data[1]) {
     $params=array_slice($data,2); // you can do here something more sophisticated
                                   // for example sanitize parameters or assemble 
                                   // an hash
     include ($fileToInclude);     //Think to this file as a servlet
  } else {
    // issue a 404 error, maybe one of the 500 series
  }
?>

URL может иметь вид: http://yoursite/servlet/reports/sales/2009 Вы также можете достичь формы http://yoursite/reports/sales/2009 немного пообщаться с .htacces и диспетчером.

Преимущество этого метода в том, что mod_rewrite не требуется, поскольку FilesMatch (1.3+) и ForceType (2.0+) находятся в ядре apache

См. Для справки
http://httpd.apache.org/docs/2.2/mod/core.html#forcetype
http://httpd.apache.org/docs/2.2/mod/core.html#filesmatch
http://www.devarticles.com/c/a/Apache/Using-ForceType-For-Nicer-Page-URLs/1/

12 голосов
/ 31 декабря 2008

Уловка, которую я использую, - это $ _ SERVER ['PATH_INFO'] (думаю, вам нужен Apache). Это даст вам всю информацию после расширения файла PHP.

http://www.example.com/page.php/rest/url

$ _ SERVER ['PATH_INFO'] будет содержать:

"/rest/url"

Страница может затем перенаправить, обработать некоторый код или что-либо еще на основе этой строки.

Это хорошо, если у вас нет доступа к Apache Configs или .HTACCESS. Также, если что-то меняется, вы можете сделать page.php именем каталога для статического размещения файлов. Ох, и PHP не должен иметь расширение .php. Я использовал .api или что-то такое в прошлом.

http://www.example.com/worker.api/rest/url

Мне кажется, это хорошо работает.

2 голосов
/ 31 декабря 2008

Как уже упоминали другие, вы можете использовать для этого mod_rewrite, но вы также можете использовать шаблон проектирования фронт-контроллера, который используют многие веб-фреймворки. Взгляните на маршруты Орды или Zend_Controller_Router_Rewrite , которые можно использовать для MVC,

2 голосов
/ 28 декабря 2008

Опции для HTTP-серверов, отличных от Apache:

Если вы используете Lighttpd, то их модуль mod_rewrite имеет совершенно другой синтаксис конфигурации. Подробнее см. http://redmine.lighttpd.net/wiki/1/Docs:ModRewrite.

Если вы используете IIS, то вам нужен ISAPI_Rewrite (http://www.isapirewrite.com/) или модуль перезаписи URL (http://learn.iis.net/page.aspx/460/using-url-rewrite-module/).

)
2 голосов
/ 28 декабря 2008

Это звучит как то, для чего обычно используется mod_rewrite (как часть Apache, а не PHP). Я не слышал ничего о PHP, который мог бы этого достичь.

2 голосов
/ 28 декабря 2008

Не может быть сделано в PHP как таковой. Обратите внимание, что в Java URL-адреса сопоставляются не сервлетам, а конфигурации контейнера сервлетов (например, Tomcat).

Вы можете добиться аналогичных результатов для приложений PHP, используя перезапись URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...