Перейти к содержимому

Фотография
- - - - -

Хэлп по регулярке .htaccess


  • Вы не можете создать новую тему
  • Закрытая тема Тема закрыта
Сообщений в теме: 11

#1 FiRеFоX

FiRеFоX

    Завсегдатай

    Топикстартер
  • V.I.P.
  • 43
    739 сообщ.

Отправлено 01 Июнь 2012 в 15:31

Страничка: site.ru/infa.php?mod=pers&login=$login , где $login - параметр в ГЕТ (логин пользователя)
прописал в .htaccess:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9_]+)/ info.php?mod=pers&login=$1 [L,QSA]
теперь страничка пользователя доступна по адресу: site.ru/$login/
Что прописать, если в ГЕТ - параметре появилась пременная типа: roomN, где N - число?
Сделал вот так:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9_]+)/room([0-9])/ info.php?mod=pers&login=$1&room=$2 [L,QSA]
RewriteRule ^([a-zA-Z0-9_]+)/ info.php?mod=pers&login=$1 [L,QSA]
Работает. Но не так как надо.. Работает только вот так:
site.ru/login/room5/
а надо что бы и так срабатывало:
site.ru/login/ещё_переменные/room5/
----------------------
Иными словами: Если есть в строке адреса roomN, неважно в каком месте, то вылезало мое окошко с вводом текста.
-------------------------------------------
Вариант в пхп, страничка info.php:
if($_GET['mod']=='pers' && $_GET['login']){
if($_GET['room']){
//Выводим всплывающее окошко, которое можно закрыть
}
//Дальше выводим информацию о пользователе
}

Сообщение отредактировал Adanos: 01 Июнь 2012 в 15:35

  • 0

Спонсор

#2 mrlasking

mrlasking

    $_GET['rich'] or die('trying');

  • Участник
  • 161
    323 сообщ.

Отправлено 01 Июнь 2012 в 16:18

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9_]+)/room([0-9]+)/ info.php?mod=pers&login=$1&room=$2 [L,QSA]

RewriteRule ^([a-zA-Z0-9_]+)/(.*)/room([0-9]+)/ info.php?mod=pers&login=$1&room=$3&other_params=$2 [L,QSA]

RewriteRule ^([a-zA-Z0-9_]+)/ info.php?mod=pers&login=$1 [L,QSA]

а если так попробовать?


update:
Кстати, если мне не изменяет память, то /room([0-9])/ при, например, /room10/ или /room100500/ не отработает. Нужно писать /room([0-9]+)/.

Сообщение отредактировал mrlasking: 01 Июнь 2012 в 16:32

  • 1

#3 FiRеFоX

FiRеFоX

    Завсегдатай

    Топикстартер
  • V.I.P.
  • 43
    739 сообщ.

Отправлено 01 Июнь 2012 в 17:06

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9_]+)/room([0-9]+)/ info.php?mod=pers&login=$1&room=$2 [L,QSA]

RewriteRule ^([a-zA-Z0-9_]+)/(.*)/room([0-9]+)/ info.php?mod=pers&login=$1&room=$3&other_params=$2 [L,QSA]

RewriteRule ^([a-zA-Z0-9_]+)/ info.php?mod=pers&login=$1 [L,QSA]

а если так попробовать?


update:
Кстати, если мне не изменяет память, то /room([0-9])/ при, например, /room10/ или /room100500/ не отработает. Нужно писать /room([0-9]+)/.

А что значит (.*)?
  • 0

#4 mrlasking

mrlasking

    $_GET['rich'] or die('trying');

  • Участник
  • 161
    323 сообщ.

Отправлено 01 Июнь 2012 в 17:16

(.*) = выбрать все, что будет находиться между скобками, вне зависимости от того, будет это "выфаоролвфлытдмдукм" или "параметр5123"

Сообщение отредактировал mrlasking: 01 Июнь 2012 в 17:18

  • 0

#5 FiRеFоX

FiRеFоX

    Завсегдатай

    Топикстартер
  • V.I.P.
  • 43
    739 сообщ.

Отправлено 01 Июнь 2012 в 17:56

(.*) = выбрать все, что будет находиться между скобками, вне зависимости от того, будет это "выфаоролвфлытдмдукм" или "параметр5123"

Спасибо, работает!
Но проще было убрать букву L во флаге.. Хотя не знаю чем это может грозить мне.. но зато работает)
Я так понял, что L означает "прекратить перебор" регулярок..
  • 0

#6 mrlasking

mrlasking

    $_GET['rich'] or die('trying');

  • Участник
  • 161
    323 сообщ.

Отправлено 01 Июнь 2012 в 18:04

Незачто, рад, что помог)

Но проще было убрать букву L во флаге..


Да, кстати, протупил я что-то. Флаг L в конце поставить нужно только. Он означает last rule - последнее выполняющееся правило.

QSA в общем то тоже не особо нужен, но так как у вас будут еще параметры, логичным будет дополнить регулярку

%{QUERY_STRING}-ом, а значит оставим)


Тобишь выглядеть теперь должно так:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9_]+)/room([0-9]+)/ info.php?mod=pers&login=$1&room=$2 [QSA]
RewriteRule ^([a-zA-Z0-9_]+)/(.*)/room([0-9]+)/ info.php?mod=pers&login=$1&room=$3&other_params=$2 [QSA]
RewriteRule ^([a-zA-Z0-9_]+)/ info.php?mod=pers&login=$1 [L,QSA]

Сообщение отредактировал mrlasking: 01 Июнь 2012 в 18:05

  • 1

#7 FiRеFоX

FiRеFоX

    Завсегдатай

    Топикстартер
  • V.I.P.
  • 43
    739 сообщ.

Отправлено 01 Июнь 2012 в 18:21

Тобишь выглядеть теперь должно так: RewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^([a-zA-Z0-9_]+)/room([0-9]+)/ info.php?mod=pers&login=$1&room=$2 [QSA]RewriteRule ^([a-zA-Z0-9_]+)/(.*)/room([0-9]+)/ info.php?mod=pers&login=$1&room=$3&other_params=$2 [QSA]RewriteRule ^([a-zA-Z0-9_]+)/ info.php?mod=pers&login=$1 [L,QSA]

Во-во! То, что надо:) Теперь все открываются по отдельности страницы и везде подключается мое окно всплывающее) Благодарю)

RewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^([a-zA-Z0-9_]+)/room([0-9]+)/ info.php?mod=pers&login=$1&room=$2 [QSA]RewriteRule ^([a-zA-Z0-9_]+)/(.*)/room([0-9]+)/ info.php?mod=pers&login=$1&room=$3&other_params=$2 [QSA]RewriteRule ^([a-zA-Z0-9_]+)/ info.php?mod=pers&login=$1 [L,QSA]

А вот у всех этих регулярок одинаковое начало, нельзя ли их все обединить в одно условие?
[b]^([a-zA-Z0-9_]+)/[/b]
Например в пхп:
if($a=='2'){echo 'Число два';}
if($a=='2'){echo 'Число два, прибавим ещё один';}
if($a=='2'){echo 'Число два, отнимем один'; }
//Можно заменить на это:
if($a=='2'){
echo 'Число два';
echo 'прибавляем один';
echo 'отнимаем один';';
}
Ну что бы не проверять каждый раз, сделать одно условие)) Нельзя никак? А то если таких будет сотня, то сервер всё будет перебирать.. а так один раз проверит одно условие и если совадет, то пойдет дальше перебирать)
  • 0

#8 mrlasking

mrlasking

    $_GET['rich'] or die('trying');

  • Участник
  • 161
    323 сообщ.

Отправлено 01 Июнь 2012 в 18:29

Думаю найдем решение, но вечер пятницы дает о себе знать, так что чуть-чуть позже подумаю и отпишусь)
  • 0

#9 mrlasking

mrlasking

    $_GET['rich'] or die('trying');

  • Участник
  • 161
    323 сообщ.

Отправлено 02 Июнь 2012 в 23:01

Adanos, думал, думал... Может мало чем помогу, но я смотрел с такой стороны: 1. Передача произвольного количества параметров; 2. Объединить все строки .htaccess. Как вариант можно написать:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9_]+)/(.*) info.php?mod=pers&login=$1&other_params=$2 [L,QSA]

И дальше уже в самом коде страницы разбирать other_params. Проверять наличие тех или иных параметров и в зависимости от этого строить логику.

Но это ситуативное такое решеньице. Не претендует даже на звание "грамотный подход". Возможно, если бы я больше знал о постановке задачи - решение бы придумал другое. Одно могу сказать точно - это должно работать, хоть это и чернуха) :blush:
  • 1

#10 FiRеFоX

FiRеFоX

    Завсегдатай

    Топикстартер
  • V.I.P.
  • 43
    739 сообщ.

Отправлено 06 Июнь 2012 в 20:54

Вновь возникла проблема..
В .htaccess у меня прописано:

RewriteRule ^([a-zA-Z0-9_]+)/ biblo.php?mod=pers&blogin=$1 [QSA]
И вот из-за этой фигни у меня не открывается ни одна картинка на сайте:(

<img src="/images/">
Это воспринимается сайтом как "biblo.php?mod=pers&blogin=$1" и картинки естественно нет.
Иными словами: Сервер из-за этой регулярки принимает слово "images" в адресе картинки не как папку, а как логин пользователя.
Что делать?
  • 0

#11 lekzd

lekzd

    parse error: parse error, unexpected T_STRING...

  • V.I.P.
  • 428
    1 125 сообщ.

Отправлено 06 Июнь 2012 в 21:19

добавьте
RewriteCond %{REQUEST_FILENAME} !-f
после RewriteEngine on

единственное что, тут не прописывается ошибка при отсутствии файла, ошибка пойдет запросом к biblo.php
  • 0

#12 FiRеFоX

FiRеFоX

    Завсегдатай

    Топикстартер
  • V.I.P.
  • 43
    739 сообщ.

Отправлено 06 Июнь 2012 в 22:23

добавьте

RewriteCond %{REQUEST_FILENAME} !-f
после RewriteEngine on

единственное что, тут не прописывается ошибка при отсутствии файла, ошибка пойдет запросом к biblo.php

Та стояло это и раньше.. один фиг не работает.. Сотру из htaccess эту регулярку - всё нормально открывается. Поставлю регулярку назад - картинок нет( В смысле они то есть, то их нет.. Когда хотят - тогда и открываются(

А нельзя никак регулярку дополнить? Что бы исключало слово "images" или может надо в папку images кинуть файл htaccess со своим каким-то содержанием, что бы это бралось как папка?

Нашел косяк) Вот блин.. И всё из-за одного символа(
Забыл знак $ поставить в конце регулярки - означает конец регулярки.
RewriteRule ^([a-zA-Z0-9_]+)/$ biblo.php?mod=pers&blogin=$1 [QSA]

Сообщение отредактировал Adanos: 06 Июнь 2012 в 21:58

  • 0



Похожие темы Свернуть

  Название темы Форум Автор Статистика Последнее сообщение
Статистика

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей