mod_rewrite

mfl
На сайте с 16.10.2006
Offline
134
mfl
464

Пример:

При обращении к url http://site.com/page/file.php необходимо открывать файл http://site.com/page_file.php

http://site.com/1/page/file.php -> http://site.com/1_page_file.php

В общем, необходимо заменить слеш в адресе на символ "_"

Следующий код работает корректно.

RewriteRule ^([^/]*)/([^/]*)$ $1_$2 [L,QSA]

RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ $1_$2_$3 [L,QSA]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ $1_$2_$3_$4 [L,QSA]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ $1_$2_$3_$4_$5 [L,QSA]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ $1_$2_$3_$4_$5_$6 [L,QSA]

Но если слешей в url будет 100, придется и в .htaccess 100 строк прописывать.

Есть ли более оптимальный способ решить такую задачу?

Спасибо.

[Удален]
#1


RewriteRule ^(.*)$ index.php?query=$1

и разбирать адрес с помощью PHP. Ну или чего у вас там вместо него.

Реализовать такое на стороне Apache тоже можно но это слишком сложно и ресурсоемко по сравнению даже с php

-
На сайте с 07.12.2005
Offline
97
-K-
#2


RewriteRule ^(.*)([^\/]+)/([^\/]*)file\.php$ $1$2_$3file.php [NC,QSA]

Это работает! Но если file.php был указан для примера, то необходимо уточнить что должно быть

-K- добавил 03.01.2009 в 22:04

Чето не сообразил сразу, если просто все / заменить на _ то:

RewriteRule ^(.*)([^\/]+)/([^\/]+)$ $1$2_$3 [NC,QSA]
neolord:

RewriteRule ^(.*)$ index.php?query=$1

и разбирать адрес с помощью PHP. Ну или чего у вас там вместо него.

Реализовать такое на стороне Apache тоже можно но это слишком сложно и ресурсоемко по сравнению даже с php

Ничего сложного и ресурсоемкого, пример выше. На PHP разбирать 100% выйдет дороже и сложнее.

mfl
На сайте с 16.10.2006
Offline
134
mfl
#3

-K-, спасибо, все работает.

Немного сократил правило. Окончательный вариант:

RewriteRule ^(.*)/([^/]+)$ $1_$2 [QSA]
[Удален]
#4
mfl:
-K-, спасибо, все работает.
Немного сократил правило. Окончательный вариант:
RewriteRule ^(.*)/([^/]+)$ $1_$2 [QSA]

оно то конечно рабоатет только позволяет сделать много недокументированных действий. например я могу запросить с вашего сайта адрес "/////////x.php" и ваш скрипт вероятней всего заглохнет. или еще страшнее "......../x.php". Последствия такой дырки додумайте сами.

а вот такой кусочек когда


$filename=str_replace("/","_",$_GET["value"]);
if (file_exists($filename)) require($filename);

Уж поверьте мне, сколько либо значительного времени не сьест. И проверок можно накрутить сколько хочешь.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий