mod rewrite и строки запроса

Я пытаюсь переписать некоторые строки запроса, которые у меня есть в моем URL-адресе:

foo.com/index.php?page=admin&view=news&action=edit&id=3 

в

 foo.com/admin/news/edit/3 

Но не могу понять это …

он также должен работать, если у меня есть только параметры страницы, так как у меня не всегда есть эти 4 параметра (страница, вид, действие, идентификатор) в моих URL-адресах.

какие-либо предложения?

Related of "mod rewrite и строки запроса"

Самый простой способ – сделать большую часть разбора в PHP-коде.

Используйте перезаписывающие устройства, такие как

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L] 

А затем получите доступ к запросу uri ( $_SERVER['REQUEST_URI'] ) из PHP и проанализируйте его на столько частей, сколько хотите.

Я написал этот код для анализа типа URL-адресов, которые вы хотите использовать, в массив параметров. Это гибко, то есть вы можете использовать параметры по-разному на каждой странице. Вам понадобится использовать его с помощью обработчика запросов, например, предложенного Джоэлем Л.

Он также позволяет на всякий случай понимать строки запросов $ _GET для старой школы, а также перезаписывает $ _SERVER ['PHP_SELF'], чтобы вести себя так, как вы ожидаете, с путём к управляющему скрипту, а не ко всему URL-адресу с все ваши параметры.

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

 <?php function parseRequestUrl($http_server = 'http://example.com'){ $request = $_SERVER['REQUEST_URI']; $request = explode('?', $request); if (isset($request[1])){ $get_data = $request[1]; parse_str($get_data, $_GET); } $request = $request[0]; $url_data = array_values(array_filter(explode('/', $request))); $url_level = substr_count($http_server, '/', 8); foreach($url_data as $key => $val){ if($key>$url_level){ $parameter[] = $val; } else if ($key==$url_level){ // controller is also stored at $this->parameter[0] $parameter[] = $controller = $val; } } if(!isset($controller) || !$controller){ $parameter[0] = $controller = 'index'; } $_SERVER['PHP_SELF'] = $http_server.'/'.$controller; return $parameter; } ?> 

Для $ http_server используйте домен вашего сайта.

Поэтому, если вы используете это по запросу: http://site.com/news/category/arts/page/5

Вы получите следующую переменную:

 $parameter[0] => 'news' $parameter[1] => 'category' $parameter[2] => 'arts' $parameter[3] => 'page' $parameter[4] => '5' 

В ваш файл .htaccess поместите эти две строки:

 RewriteRule ^/([^/]+)$ index.php?page=$1 [L] RewriteRule ^/([^/]+)/([^/]+)/([^/]+)/([^/]+)$ index.php?page=$1&view=$2&action=$3&id=$4 [L] 

Затем вместо того, чтобы называть ваши страницы типа example.com/index.php?var=1&var=2 …, вызывайте их так: example.com/1/2 …

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?([^/]*) index.php?page=$1&view=$2&action=$3&id=$4 

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