Mod_rewrite плоские ссылки

Я пытаюсь отобразить свои переменные get в виде плоских ссылок. Хотите изменить это:

http://mydomain.com/index.php?page=shop&var1=hat&var2=10

to

http://mydomain.com/index.php/shop/hat/10

Пожалуйста, имейте в виду, что нет фиксированного количества переменных, поэтому я использую var1, var2,... и т.д.

[edit] У меня уже есть частично работающий скрипт, но он работает только с 3 переменными

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
RewriteRule ^([^/\.]+)/?$ index.php?page=$1 [L]
RewriteRule ^([^/\.]+)/?([^/\.]+)/?$ index.php?page=$1&var=$2 [L]
RewriteRule ^([^/\.]+)/?([^/\.]+)/?([^/\.]+)/?$ index.php?page=$1&var=$2&var2=$3 [L]
RewriteRule ^([^/\.]+)/?([^/\.]+)/?([^/\.]+)/?$ index.php?page=$1&var=$2&var2=$3&var3=$4 [L]

person razvan    schedule 14.04.2011    source источник


Ответы (2)


Итак, сначала запомните, что mod_rewrite работает следующим образом:

http://mydomain.com/index.php/shop/hat/10

(какой тип клиента) переписывается на

http://mydomain.com/index.php?page=shop&var1=hat&var2=10

(то, что обслуживается клиенту), но не обязательно отображается как последний. (Если вы не сделаете это перенаправлением)

Итак, если ваш формат полностью описан здесь:

RewriteRule ^index\.php/([^/]+)/([^/]+)/([0-9]+)$ /index.php?page=$1&var2=$2&var2=$3

Должно быть хорошо.

ИЗМЕНИТЬ:

О, кстати! Я не учел переменный номер переменной. Я думаю, это не должно обрабатываться mod_rewrite. Возможно, лучше всего будет RewriteRule index.php/(.*) /index.php?call=$1, а затем использовать свой скрипт, чтобы взорваться, используя разделитель /.

Вы можете сделать это только в том случае, если вы уже знаете номер переменной только AFAIK.

person M'vy    schedule 14.04.2011
comment
Спасибо за помощь. Ваш скрипт выглядит хорошо и выглядит так, как будто он должен работать, но он дает мне объект, который не найден. Может я что-то упустил, вот моя реализация вашего кода ‹IfModule mod_rewrite.c› RewriteEngine on RewriteRule ^index\.php/([^/]+)/([^/]+)/([0-9 ]+)$ /index.php?page=$1&var2=$2&var2=$3 ‹/IfModule›. Сайт находится в тестовом режиме и не находится в корне домена. - person razvan; 14.04.2011
comment
Ах! Мои правила работают, только если ваш index.php находится в корне. Вы пытались добавить ссылку на каталог перед index.php? - person M'vy; 14.04.2011
comment
Это работает так, как вы предполагали во втором решении ^(.*)?$ index.php?page=$1 [L]. Не работает ни с index.php, ни с каталогом. Мне этого достаточно. Спасибо за помощь!! - person razvan; 14.04.2011

Вы можете просто направить все запросы непосредственно в index.php (это называется начальной загрузкой) и позволить сценарию анализировать переменные.

Вот как это делается с Zend Framework, вам стоит на это взглянуть. У ZF также есть множество других полезных вещей, которые вы могли бы использовать.

Это мой блок перезаписи с одного из моих виртуальных хостов с веб-сайтом на платформе ZF.

    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteCond %{REQUEST_FILENAME} !-s
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI}      !^/favicon.ico
    RewriteRule ^.*$ index.php [NC,L]
person Phliplip    schedule 14.04.2011