есть ли функция PHP для имитации работы apache mod_rewrite? - PullRequest
1 голос
/ 21 июня 2011

Я застрял здесь, так что мне нужна функция или идея создать функцию, чтобы работать почти так же, как mod_rewrite в Apache.Предполагается иметь в качестве параметра регулярное выражение, записанное для mod_rewrite и URL-адрес.Должен вернуть массив параметров, извлеченных из него.

Вот краткий пример того, как он должен работать:

    function rewrite($regexp, $url){ 
           ....
    }

    $params = rewrite('([^/]+)-([^/]+).html', 'Oval-Shape.html');

    print_r($params);

Код выше должен вывести:

   array(1=>Oval, 2=>Shape)

Ответы [ 3 ]

7 голосов
/ 21 июня 2011

Да, RewriteRule использует Perl-совместимое регулярное выражение. Это то же самое, что PHP делает в preg_match().

Разница в том, что в ModRewrite вы можете поставить префикс !, чтобы не совпадать с чем-либо.

Другое дело, что когда вы добавляете флаг NC, они не чувствительны к регистру. В регулярных выражениях PHP это может быть достигнуто с помощью модификатора i.

Итак, прежде чем начать заново изобретать колесо, почему бы не выбрать эту функцию? Это работает так:

$url = 'Oval-Shape.html';
$regexp = '([^/]+)-([^/]+).html';
$result = preg_match("({$regexp})i", $url, $params);
print_r($params);

И это вывод:

Array
(
    [0] => Oval-Shape.html
    [1] => Oval
    [2] => Shape
)

Итак, $params[1] - это то, что вы знаете как $1 в .htacces и т. Д.

2 голосов
/ 21 июня 2011

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

Поместите это в свой .htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

Таким образом, каждый запрос направляется в index.php.Затем вы можете получить и проанализировать переменную $_SERVER['REQUEST_URI'] и переслать выполнение страницы куда хотите.

Это то, что делает каждая текущая инфраструктура MVC.Это называется маршрутизацией.

2 голосов
/ 21 июня 2011

Вы не сможете полностью смоделировать Apache mod_rewrite, потому что Apache перепишет URL-адрес перед отправкой запроса, тогда как при вызове PHP запрос уже был отправлен.Например, если вы запрашиваете

/index.php?page=mypage

с .htaccess как

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*)$ index.php?page=$1 [NC,L]

Вы также можете запросить тот же URL с

/mypage

, что приведет кв index.php вызывается с $_SERVER['REQUEST_URI'] = '/mypage' и $_GET['page'] = 'mypage'. Это поведение не может быть реплицировано PHP, поскольку Apache не найдет mypage и выдаст ошибку 404.

...