rapture112
24.10.2015 - 20:11
Доброго времени суток. По-моему,на форуме спрашиваю совета впервые, т.к. проблемы и непонятки , которые у меня возникают с mod_rewrite, гугл решить мне не помог.
Так вот:
Через mod_rewrite нужно преобразовывать ссылки вида site.com/generator и site.com/generator.php в ссылки site.com/index.php?act=generator.
Преобразование site.com/generator.php в site.com/index.php&act=generator я сделал:
RewriteRule ([a-z,_]+)\.php$ index.php?act=$1
Теперь,чтобы и site.com/generator преобразовывалось в нужную мне ссылку,я перед первым rewriterule поставил еще один:
RewriteRule ^([^.=]+)$ $1.php
По логике ссылка site.com/generator преобразуется сначала в site.com/generator.php,а потом уже в site.com/index.php?act=generator.
Но меня просто перебрасывало на главную страницу(site.com/). Никак не мог понять, почему ничего не работает. Потом просто поменял местами Rewrite Rule,и файл htacess у меня стал выглядеть так:
AddDefaultCharset UTF-8
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-z,_]+)\.php$ index.php?act=$1
RewriteRule ^([^.=]+)$ $1.php
Все заработало. Теперь site.com/generator кидал меня на site.com/index.php?act=generator( при этом зрительно ссылка оставалась прежней).
Вопрос 1: почему не сработал первый вариант,когда сначала шло ^([^.=]+)$ $1.php ?
Допустим,для первого варианта имеем запрос:
site/generator
На обработку RewriteRule попадает generator(т.к. htaccess находится в папке site/)
Генератор преобразуется в generator.php по первому rewriteRule
Затем по второму generator.php преобразуется в index.php?act=generator
Затем при подстановке Rewrite base имеем site/index.php?act=generator(что нам и нужно)
Повторный цикл не пойдет,т.к. результат rewriterule не будет меняться.
Вроде все должно работать и с первым случаем,что не так?
Так,вот второй момент:
Когда мы переходим по ссылке site.ru/generator?download=5, GET-параметр download теряется. При выводе GET-массива у нас имеется только параметр act=generator. В этом,в общем-то,и заключается второй вопрос: как правильно сформировать ссылку с гет параметром, чтобы при имеющемся RewriteRule все работало нормально.
P.S. Обычно сам разбираюсь со всем, но эта проблема реально достала, уже не первый день с ней парюсь, все облазил. Объясните,пожалуйста,кто шарит,как все работает.
rapture112
24.10.2015 - 21:19
Несколько часов чесания репы привели к тому,что я для каждого GET-параметра( благо,на сайте используются только 4), написал свой RewriteRule. Остался открытым 1й вопрос: почему первый представленый вариант:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.=]+)$ $1.php
RewriteRule ^([a-z,_]+)\.php$ index.php?act=$1
Не работал,а второй(наоборот) - работал?
(Требуется ссылки вида site.com/generator и site.com/generator.php преобразовывать в ссылки вида site.com/index.php?act=generator
killer8080
25.10.2015 - 22:19
rapture112если реврайт работает не так как предполагается, нужно дебажить. В конфиге виртуального хоста пропиши
<Ifmodule mod_rewrite.c>
RewriteLog "/path/to/rewrite.log"
RewriteLogLevel 3
</Ifmodule>
Цитата (rapture112 @ 24.10.2015 - 20:19) |
стался открытым 1й вопрос: почему первый представленый вариант:
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^.=]+)$ $1.php RewriteRule ^([a-z,_]+)\.php$ index.php?act=$1
Не работал,а второй(наоборот) - работал? |
если посмотреть rewrite.log то станет понятно почему
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8b00a0/initial] (3) [perdir /media/d/WebServers/home/test/www/site/] strip per-dir prefix: /media/d/WebServers/home/test/www/site/generate -> generate
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8b00a0/initial] (3) [perdir /media/d/WebServers/home/test/www/site/] applying pattern '^([^.=]+)$' to uri 'generate'
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8b00a0/initial] (2) [perdir /media/d/WebServers/home/test/www/site/] rewrite 'generate' -> 'generate.php'
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8b00a0/initial] (3) [perdir /media/d/WebServers/home/test/www/site/] add per-dir prefix: generate.php -> /media/d/WebServers/home/test/www/site/generate.php
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8b00a0/initial] (2) [perdir /media/d/WebServers/home/test/www/site/] strip document_root prefix: /media/d/WebServers/home/test/www/site/generate.php -> /site/generate.php
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8b00a0/initial] (1) [perdir /media/d/WebServers/home/test/www/site/] internal redirect with /site/generate.php [INTERNAL REDIRECT]
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8a26c8/initial/redir#1] (3) [perdir /media/d/WebServers/home/test/www/site/] strip per-dir prefix: /media/d/WebServers/home/test/www/site/generate.php -> generate.php
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8a26c8/initial/redir#1] (3) [perdir /media/d/WebServers/home/test/www/site/] applying pattern '^([^.=]+)$' to uri 'generate.php'
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8a26c8/initial/redir#1] (3) [perdir /media/d/WebServers/home/test/www/site/] strip per-dir prefix: /media/d/WebServers/home/test/www/site/generate.php -> generate.php
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8a26c8/initial/redir#1] (3) [perdir /media/d/WebServers/home/test/www/site/] applying pattern '^([a-z,_]+)\\.php$' to uri 'generate.php'
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8a26c8/initial/redir#1] (2) [perdir /media/d/WebServers/home/test/www/site/] rewrite 'generate.php' -> 'index.php?act=generate'
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8a26c8/initial/redir#1] (3) split uri=index.php?act=generate -> uri=index.php, args=act=generate
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8a26c8/initial/redir#1] (3) [perdir /media/d/WebServers/home/test/www/site/] add per-dir prefix: index.php -> /media/d/WebServers/home/test/www/site/index.php
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8a26c8/initial/redir#1] (2) [perdir /media/d/WebServers/home/test/www/site/] strip document_root prefix: /media/d/WebServers/home/test/www/site/index.php -> /site/index.php
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc8a26c8/initial/redir#1] (1) [perdir /media/d/WebServers/home/test/www/site/] internal redirect with /site/index.php [INTERNAL REDIRECT]
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc89e240/initial/redir#2] (3) [perdir /media/d/WebServers/home/test/www/site/] strip per-dir prefix: /media/d/WebServers/home/test/www/site/index.php -> index.php
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc89e240/initial/redir#2] (3) [perdir /media/d/WebServers/home/test/www/site/] applying pattern '^([^.=]+)$' to uri 'index.php'
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc89e240/initial/redir#2] (3) [perdir /media/d/WebServers/home/test/www/site/] strip per-dir prefix: /media/d/WebServers/home/test/www/site/index.php -> index.php
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc89e240/initial/redir#2] (3) [perdir /media/d/WebServers/home/test/www/site/] applying pattern '^([a-z,_]+)\\.php$' to uri 'index.php'
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc89e240/initial/redir#2] (2) [perdir /media/d/WebServers/home/test/www/site/] rewrite 'index.php' -> 'index.php?act=index'
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc89e240/initial/redir#2] (3) split uri=index.php?act=index -> uri=index.php, args=act=index
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc89e240/initial/redir#2] (3) [perdir /media/d/WebServers/home/test/www/site/] add per-dir prefix: index.php -> /media/d/WebServers/home/test/www/site/index.php
127.0.0.1 - - [25/Oct/2015:22:02:18 +0300] [test/sid#7f45b6811418][rid#7f45bc89e240/initial/redir#2] (1) [perdir /media/d/WebServers/home/test/www/site/] initial URL equal rewritten URL: /media/d/WebServers/home/test/www/site/index.php [IGNORING REWRITE]
Цитата (rapture112 @ 24.10.2015 - 19:11) |
Так,вот второй момент: Когда мы переходим по ссылке site.ru/generator?download=5, GET-параметр download теряется. При выводе GET-массива у нас имеется только параметр act=generator. |
реврайт откидывает query string при обработке, если его нужно сохранить используй флаг QSA