Apache Rewrite Issue, пользовательский URI - PullRequest
0 голосов
/ 30 июня 2010

У меня есть решение, но я знаю, что оно не самое лучшее, и было бы лучше решить его с полной перепиской. В основном у меня есть 3 переписывания, которые будут идти в нужные мне области и делать то, что им нужно. Однако, чтобы переключаться между тем, куда мне нужно идти, мне пришлось написать URI-класс, чтобы пролистать URL-адрес, установить страницу и переменные вручную. Все работает отлично, но URL-адреса - боль в заднице, особенно если они не отформатированы точно.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/bsiadmin/$ /bsiadmin/index.php [L,QSA]
RewriteRule ^/bsiadmin/(.+)/$ /bsiadmin/index.php?page=$1 [L,QSA]
RewriteRule ^/(.+)/$ /index.php?page=$1 [QSA]

Таким образом, первое правило будет направлять все в каталог, а не в корневой index.php, второе правило делает то же самое, если указана «страница». Последнее правило возьмет все остальное и убедится, что оно использует корневой index.php и идет оттуда.

Пример URL:

http://mysite.test/icecream/id=2/

Мой пользовательский класс URI будет очищать этот идентификатор и устанавливать идентификатор как переменную $ _REQUEST.

Полагаю, я действительно хочу знать, как я могу просто переписать простой URL, такой как:

http://mysite.test?page=icecream&id=2

AS

http://mysite.test/icecream/id/2/

Без каких-либо ограничений на количество передаваемых переменных и на каталог, который существует "bsiadmin", чтобы отображать его без необходимости использовать класс uri для направления.

Спасибо за помощь.

1 Ответ

2 голосов
/ 30 июня 2010

Вы можете использовать mod_rewrite для этого:

RewriteRule ^/([^/]+)/([^/]+)/([^/]+)/(.*) /$1/$4?$2=$3 [N,QSA]
RewriteRule ^/([^/]+)/$ /bsiadmin/index.php?page=$1 [L,QSA]

Но я думаю, что лучше всего было бы использовать PHP для этой работы. Потому что с mod_rewrite вы можете перезаписывать только фиксированное количество аргументов URL за раз (здесь по одному при каждом перезаписи). С помощью PHP вы можете анализировать любое произвольное количество аргументов, например:

$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$segments = explode('/', $_SERVER['REQUEST_URI_PATH']);
if (count($segments) > 2) {
    for ($i=4, $n=count($segments); $i<$n; $i+=2) {
        $_GET[rawurledecode($segments[$i-1])] = rawurldecode($segments[$i]);
    }
    $_GET['page'] = rawurldecode($segments[1]);
}

Тогда все, что вам нужно для mod_rewrite - это единственное правило для перезаписи запросов в ваш index.php :

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !^/bsiadmin/index\.php$ /bsiadmin/index.php [L]
...