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,... и т.н.

[редактиране] Вече имам частично работещ скрипт, но работи само с максимум 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

Би трябвало да е добре.

РЕДАКТИРАНЕ:

О, BTW! Не взех предвид променливия номер на променливата. Мисля, че това не трябва да се обработва от mod_rewrite. Може би най-добрият изстрел е да RewriteRule index.php/(.*) /index.php?call=$1 и след това да използвате скрипта си, за да експлодирате с помощта на / разделител.

Можете да го направите само ако вече знаете номера на променливата само AFAIK.

person M'vy    schedule 14.04.2011
comment
Благодаря за помощта. Вашият скрипт изглежда добре и изглежда, че трябва да работи, но ми дава обект, който не е намерен. Може би пропускам нещо, ето моята реализация на вашия код ‹IfModule mod_rewrite.c› RewriteEngine на 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 (наречено bootstrapping) и да оставите скрипта да анализира променливите.

Ето как се прави с Zend Framework, трябва да го разгледате. ZF има и много други екстри, които можете да използвате.

Това е моят блок за презаписване от един от моите vhost с уебсайт, захранван от 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