mod_rewrite для API REST на PHP - PullRequest
       32

mod_rewrite для API REST на PHP

6 голосов
/ 27 декабря 2011

Я хочу, чтобы каждый звонок с

http://localhost/api/

(как корневая папка ), например http://localhost/api/get/users на самом деле http://localhost/api/index.php?handler=get/users.

http://localhost/api/get/user/87 должно быть http://localhost/api/index.php?handler=get/user/87, где в index.php Я бы поймал переменную $ _GET обработчик и обработал бы ее надлежащим образом.

Если у меня есть такие правила перезаписи, это работает только для одного

RewriteRule ^([^/\.]+)/?$ index.php?handler=$1 [QSA,L]

два

RewriteRule ^([^/\.]+)/?$ index.php?handler=$1 [QSA,L]
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?handler=$1&handler2=$2 [QSA,L]

три слеша и так далее ...

RewriteRule ^([^/\.]+)/?$ index.php?handler=$1 [QSA,L]
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?handler=$1&handler2=$2 [QSA,L]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?handler=$1&handler2=$2&handler3=$3 [QSA,L]

Таким образом, для первого случая http://localhost/api/a будет работать, но http://localhost/api/a/b приведет к ошибке Not Found .

РЕДАКТИРОВАТЬ : Это должно быть хорошо?

RewriteRule ^(.*)$ index.php?handler=$1 [L,QSA]

1 Ответ

9 голосов
/ 27 декабря 2011

Ваш (собственный) ответ должен быть в порядке, просто имейте в виду, что он перенаправит все входящих URL-адресов на index.php. То есть если у вас есть статические файлы, например /js/jquery.js, то он будет изменен на index.php?handler=/js/jquery.js.

Если вы хотите избежать проблем, попробуйте что-то вроде:

RewriteCond %{REQUEST_URI} !(.*)\.(css|js|htc|pdf|jpg|jpeg|gif|png|ico)$ [NC]
RewriteRule ^(.*)$ index.php?handler=$1 [QSA,L]

Два совета:

Пожалуйста, попробуйте использовать директиву RewriteLog: она поможет вам отследить такие проблемы:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

Мой любимый инструмент для проверки регулярных выражений:

http://www.quanetic.com/Regex (не забудьте выбрать ereg (POSIX) вместо preg (PCRE)!)

...