Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Apache RewriteRule с обработкой одной или двух переменных  (Прочитано 1871 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн zmz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Приветствую.

Стоит Ubuntu l.a.m.p.

В cms друпал есть удобный модуль node_type_filter,
который добавляет в урл переменную для дополнительной фильтрации по типу контента

1 действие (стандартное)
первоначальный урл http://www.ru/?q=geo/rossiya
преобразуется стандартным drupal'еровским правилом
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
в http://www.ru/geo/rossiya

2 действие
модуль node_type_filter добавляет вторую переменную, например type=news
http://www.ru/?q=geo/rossiya&type=news
с финальным урлом http://www.ru/geo/rossiya/news

Вопрос: как эту переменную правильно прописать в clean url посредством RewriteRule

для 2го действия правило сделал
и при наличии двух переменных (?q и &type) в урле правило работает
RewriteRule ^(.*)/(.*)$ index.php?q=$1&type=$2 [L,QSA]
но при наличии только одной переменной (?q) правило не работает

[L] убирал не помогло  :idiot2:


С уважением

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28511
    • Просмотр профиля
Ты вообще ахинею какую-то несёшь.
Определись сначала, какие у тебя урлы исходные, а какие результирующие, чтобы самому понятно стало.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн zmz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
наверное плохо объясняю

1й случай
исходный http://www.ru/?q=geo/rossiya
результат http://www.ru/geo/rossiya
делается правилом по умолчанию
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]


2й случай ( происходит при нечастом добавлении второй переменной type=news )
исходный http://www.ru/?q=geo/rossiya&type=news
результат http://www.ru/geo/rossiya/news

правило
RewriteRule ^(.*)/(.*)$ index.php?q=$1&type=$2 [L,QSA]
страница отображается корректно только при наличии двух переменных в урле

как заставить работать вместе оба правила пока не понятно
[L] убирал, местами строчки переставлял
« Последнее редактирование: 08 Августа 2011, 01:14:10 от zmz »

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28511
    • Просмотр профиля
Вы тупите, а не плохо объясняете.
По правилу
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
у вас никак не может получиться результат
http://www.ru/geo/rossiya
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн zmz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
=)
походу туплю не я
(ещё раз проверил)

Пользователь решил продолжить мысль [time]Mon Aug  8 01:30:45 2011[/time]:
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Цитировать
Левая часть: ^(.*)$
Крышка вначале означает начало строки.
Бакс в конце означает конец строки.
Точка в скобочках означает любой символ.
Звездочка после точки означает, что любых символов может быть от нуля до бесконечности.
Скобочки означают группу. Т.к. она первая (и единственная), то эта группа идет под номером 1.

Правая часть: index.php?q=$1
означает, что мы перезаписываем url на index.php?q= и к этому добавляем первую группу $1, т.е. имя запрашиваемого файла.

Флаги [L,QSA]
'last|L' (последнее правило)
Остановить процесс преобразования на этом месте и не применять больше никаких правил преобразований. Это соответствует оператору last в Perl или оператору break в  языке C. Используйте этот флаг для того, чтобы не преобразовывать текущий URL другими, следующими за этим, правилами преобразований.

'qsappend|QSA' (query string append - добавлять строку запроса)
Приплюсовать то, что идет после знака вопроса. Например, если урла была такая, http://mysite.com/node/1?size=_original, то в броузере останется такой-же, но скрипту пойдет в таком виде: http://mysite.com/index.php?q=/node/1?size=_original

отседова http://www.drupal.ru/node/2643
« Последнее редактирование: 08 Августа 2011, 01:31:37 от zmz »

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28511
    • Просмотр профиля
Именно.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн zmz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
именно
вне зависимости от ваших воплей

RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
работает у нескольких сотен тысяч друпальных (вер.6) сайтов
« Последнее редактирование: 08 Августа 2011, 11:09:21 от zmz »

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28511
    • Просмотр профиля
Конечно, работает. Только не так, как вы описываете.
Ладно, мне надоело вам мозги выправлять, объясняю.
У вас исходный URL не /?q=geo/rossiya а /geo/rossiya
От непонимания этого, и того, как вообще работает mod_rewrite, и даже неспособности прочитать и осмыслить русское описание правил, которое вы только и смогли, что процитировать, у вас и пошла проблема.
Если решать проблему так, как вы пытаетесь её решать, то всё тривиально:

RewriteRule ^(/geo/[^/]*)/(.*)?$ index.php?q=$1&type=$2 [qsappend,last]
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн zmz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
да примерно так
это я уже понял

но логика пока не работает


Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28511
    • Просмотр профиля
Это решение в ОДНО действие.
Если не работает - ставьте RewriteLogLevel 3 и читайте дамп реврайтов.
Если сами не справитесь - показывайте полностью свои реврайты, и что именно не работает (на каких URL сбоит).
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн zmz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
работает так:

  #              /geo/rossiya/news
  #  perevodim v /?q=geo/rossiya&type=news
  #
  RewriteRule ^(geo.*)/(.*)/(news.*)$ index.php?q=$1/$2&type=$3 [L,QSA]
  RewriteRule ^(geo.*)/(.*)/(blog.*)$ index.php?q=$1/$2&type=$3 [L,QSA]

  # drup standart rule
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

неудобность в перечеслинии всех категорий материалов (news, blog)
хотя с другой стороны так безопасней

п.с.
RewriteLogLevel 3
о спасибо
надо было сразу в это ткунуть
« Последнее редактирование: 10 Августа 2011, 15:33:50 от zmz »

 

Страница сгенерирована за 0.017 секунд. Запросов: 22.