Я пытаюсь переписать некоторые строки запроса, которые у меня есть в моем URL-адресе:
foo.com/index.php?page=admin&view=news&action=edit&id=3
в
foo.com/admin/news/edit/3
Но не могу понять это …
он также должен работать, если у меня есть только параметры страницы, так как у меня не всегда есть эти 4 параметра (страница, вид, действие, идентификатор) в моих URL-адресах.
какие-либо предложения?
Самый простой способ – сделать большую часть разбора в 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, все параметры являются необязательными.