IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   mod_rewrite (вопрос) (https://www.imho.ws/showthread.php?t=78831)

vitaminov-net 30.01.2005 22:43

mod_rewrite (вопрос)
 
Пожалуйста помогите,

ндо срочно сделать, а разобраться не могу (((


Задача в слудующем:
есть: pub.php?l=rus&linkpage=hotels&linkpage2=fadaer&linkpage3=mosv&idpub=56 7

Надо сделать:
rus/hotels/fadaer/mosv/567/


Делаю в htacess так:

RewriteEngine on
Options +FollowSymlinks
RewriteRule ^rus/(.*)?/?$ pub.php?l=rus&linkpage=$1&linkpage2=$2&linkpage3=$3&idpub=$4 [L]


а не работает (((

zaartix 31.01.2005 00:08

[офф]
Можно и не через mod_rewrite, а средствами php
Как вариант вот пример:
if ($PATH_INFO) {
$path=ereg_replace('^/','?',$PATH_INFO);
$path=preg_replace("!\?(.*?)/!si","&\\1=",$path);
$path=preg_replace("!/(.*?)/(.*?)!si","&\\1=\\2",$path);
parse_str($path);
}
а ссылки имеют вид:
http://site.com/index.php/contacts/our - к примеру

только не везде апач передает скрипту эту переменную $PATH_INFO, всмысле не на всех серверах. На апаче2 я так и не смог сделать это, на первом все ок.

Hubbitus 31.01.2005 00:15

RewriteRule rus/(.*)?/(.*)?/(.*)?/(.*)?/(.*)?/?$ pub.php?l=rus&linkpage=$1&linkpage2=$2&linkpage3=$3&idpub=$4

vitaminov-net 31.01.2005 00:46

Hubbitus

что то не работает, сделал так:
RewriteEngine on
Options +FollowSymlinks
RewriteRule ^rus/(.*)?/(.*)?/(.*)?/(.*)?/(.*)?/?$ pub.php?l=rus&linkpage=$1&linkpage2=$2&linkpage3=$3&idpub=$4 [L]

Hubbitus 31.01.2005 03:32

Незнаю, я проверил (до того как постить, и сейчас еще раз) - все работает как надо.
А вообще у тебя Mod_Rewrite включен, работает?

vitaminov-net 31.01.2005 10:50

Hubbitus
Да извиняюсь, работает все но:
RewriteRule ^rus/(.*)?/(.*)?/(.*)?/(.*)?/?$ /pub.php?l=rus&linkpage=$1&linkpage2=$2&linkpage3=$3&idpub=$4 [L]

ссылки типа www.vbvb.com/rus/about/info/more/1/ - работают,
, а
www.vbvb.com/rus/about/info/ - уже нет (((

мне надо допустим чтоб
www.vbvb.com/rus/about/11/
и открывалась pub.php?l=rus&linkpage=about&linkpage2=linkpage3=&idpub=11


как это сделать?

Hubbitus 31.01.2005 12:07

Цитата:

vitaminov-net:
мне надо допустим чтоб
www.vbvb.com/rus/about/11/
и открывалась pub.php?l=rus&linkpage=about&linkpage2=linkpage3=&idpub=11
А может тогда сделать параметр idpub вначале а не в конце? Просто я не знаю (если возможно вообще), как сослаться на последний найденный элемент, если не известно их количество заранее. Ну а сделать их необязательными несложно, просто наставь в нужных местах нужных квантификаторов. Тоесть количество элементов это не проблема, проблема пропустить отсутствующие и присвоить значение последнему. А если изменить порядок - то все сразу становится просто.

vitaminov-net 31.01.2005 12:24

Hubbitus
если я правильно понял, то это:
www.vbvb.com/rus/1/more/about/ ?
в таком случае пропадает смысл ЧПУ..

Hubbitus 31.01.2005 12:48

Какой ЧПУ? И почему пропадет смысл? Ничего не понял.

Ну еще как вариант конечно можно передавать как у меня было, только все сделать необязательным, а в скрипте уже искать последний непустой параметр и принимать его за idpub. Такой путь мне кажется менее правильным, чем предложенный до этого.

hempsmoke 27.04.2005 18:18

Цитата:

vitaminov-net:
Да извиняюсь, работает все но:
RewriteRule ^rus/(.*)?/(.*)?/(.*)?/(.*)?/?$ /pub.php?l=rus&linkpage=$1&linkpage2=$2&linkpage3=$3&idpub=$4 [L]

ссылки типа www.vbvb.com/rus/about/info/more/1/ - работают,
, а
www.vbvb.com/rus/about/info/ - уже нет (((

мне надо допустим чтоб
www.vbvb.com/rus/about/11/
и открывалась pub.php?l=rus&linkpage=about&linkpage2=linkpage3=&idpub=11


как это сделать?
Hubbitus
плиз, приведи пример, а то самому теперь надо, чтобы
pub.php?l=rus в rus
pub.php?l=rus&linkpage=about в rus/about
pub.php?l=rus&linkpage=about&linkpage2=ours в rus/about/ours
и т.д. всего 4 таких переменных.

работает только, когда все 4 переменные присутсвуют :(
Спасибо.

hempsmoke 27.04.2005 20:32

и ее непонятнО: как можно огородить, чтобы изменение записи было только на файле index.php, а на admin.php и view.php нет.

Hubbitus 28.04.2005 09:54

Цитата:

hempsmoke:
работает только, когда все 4 переменные присутсвуют :Frown:
Я же говорил, чтобы работало с меньшим количеством, нужно их сделать необязательными, например так:
RewriteRule ^rus/(.*)?(/.*)?(/.*)?(/.*)?/?$

Цитата:

hempsmoke:
и ее непонятнО: как можно огородить, чтобы изменение записи было только на файле index.php, а на admin.php и view.php нет.
Легко, просто исключи из обработки указанные файлы:
RewriteCond %{REQUEST_FILENAME} !^.*(/admin.php|/view.php)$
Ну или наоборот, включи только для конкретного(ых), например так:
RewriteCond %{REQUEST_FILENAME} ^.*(/index.php)$

Ну естественно RewriteCond должен стоять до RewriteRule.

hempsmoke 28.04.2005 11:59

Цитата:

Hubbitus:
Я же говорил, чтобы работало с меньшим количеством, нужно их сделать необязательными, например так:
RewriteRule ^rus/(.*)?(/.*)?(/.*)?(/.*)?/?$
неа, не срабатывает.
RewriteRule ^ cat/(.*)?(/.*)?(/.*)?(/.*)?/?$ index.php?cat=$1&subcat=$2&subcat2=$3&art=$4

Цитата:

Hubbitus:
Легко, просто исключи из обработки указанные файлы:
RewriteCond %{REQUEST_FILENAME} !^.*(/admin.php|/view.php)$
Ну или наоборот, включи только для конкретного(ых), например так:
RewriteCond %{REQUEST_FILENAME} ^.*(/index.php)$
спасибо!

Hubbitus 28.04.2005 12:56

Цитата:

hempsmoke:
неа, не срабатывает.
Точно, не срабатывает. Каюсь, не проверил, а так работает:
RewriteRule ^cat/([^/]*)?/?([^/]*)?/?([^/]*)?/?$ /index.php?cat=$1&subcat=$2&subcat2=$3&art=$4 [L]

Ну и скольку угодно можно прописать их так, хоть 100 параметров возможных и необязательных.

hempsmoke 28.04.2005 14:45

неа :(

Hubbitus 28.04.2005 15:13

Цитата:

hempsmoke:
неа :Frown:
Как это "неа", если это я уже проверил и все работало прекрасно!!!
Приведи что ты написал конкретно, и на чем тестируешь что не работает.

hempsmoke 28.04.2005 16:49

вот это прописано и .htaccess
Код:

RewriteEngine on
Options +FollowSymlinks
RewriteCond %{REQUEST_FILENAME} !\.(swf)|(jpg)|(png)|(gif)|(pcx)$
RewriteCond %{REQUEST_FILENAME} !^.*(/admin.php|/view.php)$
RewriteRule ^cat/([^/]*)?/?([^/]*)?/?([^/]*)?/?$ /index.php?cat=$1&subcat=$2&subcat2=$3&art=$4 [L]

ни локально, ни на на двух других хостингах не работает, к сожалению.
Выдает 404.

Hubbitus 28.04.2005 19:53

Цитата:

hempsmoke:
ни локально, ни на на двух других хостингах не работает, к сожалению.
Выдает 404.
А в логах смотрел чего именно не находит, запрошенный файл или файл index.php? Может у тебя index.php лежит просто не в корне сайта, и тогда попробуй в последней строке /index.php на просто index.php заменить. И вообще приведи пару строк о 404 из логов.

Sensey 29.04.2005 02:08

Насчет проблемы что если не все параметры - то не работает....
Тут есть одна хистрость - заключается она в порядке расположения строчке в htaccess

Порядок должен быть такой :

строка с урлом шде параметров очень много
потом строка где параметров меньше
потом строка где параметров еще меньше
строка где параметров вообще нету

И тогд все будет пучком...

PSyton 29.04.2005 06:12

А не проще ли передавать в скрипт поный путь, а потом просто разбивать и анализировать его вручную?
.htaccess:
Код:

RewriteRule rus/(.*) pub.php?path=$1 [L]
а потом в pub.php разбить этот путь на составляющие

Hubbitus 29.04.2005 09:09

Цитата:

pvs:
А не проще ли передавать в скрипт поный путь, а потом просто разбивать и анализировать его вручную?
Да вобщем не проще... а чем это вдруг проще? Да и зачем перекладывать на скрипт лишнюю, бесполезную работу???

hempsmoke 29.04.2005 12:06

Цитата:

Sensey:
строка с урлом шде параметров очень много
потом строка где параметров меньше
потом строка где параметров еще меньше
строка где параметров вообще нету
я пробовал так :) даже работало, но как-то это не так.

Hubbitus
спасибо ;) пробуемс.

Sensey 29.04.2005 14:25

hempsmoke

[q]я пробовал так даже работало, но как-то это не так.[/q]

Все так.. просто есть две логики... для начала :

файл читается сверху вниз... поэтому строчки выполняются тоже сверху вниз и пока не найдут нужно правило - строчки будут выполняться...

1 способо - так как я сказал...
2 - определять сложными регулярками когда кончается урл

имхо 1 способ быстрее

hempsmoke 29.04.2005 15:30

Sensey
спасибо. а я располагал как раз наоборот.

Hubbitus помог и предложил следущий вариант:
Цитата:

RewriteRule ^([^/]*)?/([^/]*)?/?([^/]*)?/?([^/]*)?/?$ index.php?cat=$1&subcat=$2&subcat2=$3&art=$4 [L]
работает! :yees: Спасибо.

Goryn 05.07.2005 18:49

Цитата:

Сообщение от Hubbitus
а так работает:
RewriteRule ^cat/([^/]*)?/?([^/]*)?/?([^/]*)?/?$ /index.php?cat=$1&subcat=$2&subcat2=$3&art=$4 [L]

Ну и скольку угодно можно прописать их так, хоть 100 параметров возможных и необязательных.

Забыл добавить в условии еще одну ([^/]*)?/ - иначе при 4-х параметрах выдает "документ не найден" (ошибка 404).
Хотя может это оттого, что я делал следующее правило:

RewriteRule ^list/([^/]*)?/?([^/]*)?/?([^/]*)?/?([^/]*)?/?$ /anime/rabota.php?cat=$1&subcat=$2&subcat2=$3&art=$4 [L]

файл .htaccess лежит подкаталоге anime домена.


А как надо слелать, чтобы выдать последний параметр за HTML-файл, то есть запрос типа

domain.ru/cat/1/2/3/4.htm

?

Я смог решить только на уровне скрипта. То есть для последнего параметра на PHP:

PHP код:

 $arte=strpos($art".htm");
 if (
$arte === false) {
// Ничего менять не надо
} else {
 
$art=substr($art,0,$arte);
}
 echo 
"$art"

Но это нужно знать, какой параметр проверять. Может, можно решить на уровне mod_rewrite для любого параметра?

Hubbitus 06.07.2005 10:06

Цитата:

Goryn:
А как надо слелать, чтобы выдать последний параметр за HTML-файл, то есть запрос типа

domain.ru/cat/1/2/3/4.htm
Если именно последний с заранее известным количеством уровней (ну скажем всегда 4) то элементарно просто, только не совсем я понял что требуется: последний параметр так и передасться как есть, хоть "4", хоть "4.htm" :idontnow: Или нужно чтобы этому файлу передавались остальные параметры? В приведенном примере не понятно что есть $arte и потому вся суть примера.

А вот если хочется чтобы количество параметров было различным, то с этим значительно сложнее: Можно попробовать помудрить в несколько строчек формировать строчку из этих параметров специальным образом, а потом соответственно разбирать ее и таким образом находить последний аргумент.

Goryn 06.07.2005 14:57

Цитата:

Сообщение от Hubbitus
В приведенном примере не понятно что есть $arte и потому вся суть примера.

В $arte записывается позиция подстроки с расширением, если такая есть. Условие взято отсюда

Hubbitus 06.07.2005 17:19

Цитата:

Goryn:
В $arte записывается позиция подстроки с расширением, если такая есть. Условие взято отсюда
Это я уже торможу с жары :)

Однако что конкретно подразумевается все-таки под:
Цитата:

Goryn:
А как надо слелать, чтобы выдать последний параметр за HTML-файл, то есть запрос типа

domain.ru/cat/1/2/3/4.htm
?

Goryn 06.07.2005 18:33

Hubbitus, ну просто чтобы было не просто набор параметров через слеш, а типа как адрес статической страницы.

Hubbitus 07.07.2005 10:35

А, дак в последнем параметре нужно просто передать без расширения его значение чтоли??

Дак это элементарно, просто замени последнее ([^/]*)? на что-то вроде этого: ([^/]*\.\w+)? (Не уверен что будет работать, но лучше даже так: ([^/]*\.\w{1,4})?)

Goryn 08.03.2006 22:54

Такой вопрос: а возможно ли с помощью mod_rewrite следущее:

У меня есть сайт на домене второго уровня. Я завожу к нему домены третьего уровня.
Возможно ли написать такую переадресацию с помощью mod_rewrite или иным способом на домене третьего уровня, чтобы у меня брались страницы из определенной папки на домене второго уровня, при этом в адресной строке браузера URL не менялся.

То есть допустим я набираю в адресной строке браузера адрес типа

http://sub.domen.ru/page.htm

А у меня вместо этого отображалось бы содержимое страницы

http://domen.ru/sub/page.htm

При том, что новый адрес в адресной строке не светится.

Hubbitus 09.03.2006 11:48

Можно, это очень популярное применение mod_rewrite, и ссылок по данному впоросу полно:

http://www.sitepoint.com/forums/showthread.php?t=344192
http://www.sitepoint.com/forums/showthread.php?t=339390
http://www.vbulletin.com/forum/archi...hp/t-2889.html
http://forum.ruweb.net/viewthread.php?tid=1430

И вообще, по запросу "subdomains on mod_rewrite" гугл выводит около 100 тыс результатов.

Надеюсь поможет.


Часовой пояс GMT +4, время: 16:50.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.