ЧПУ - почему последний блок когда он в конце не работает?

Тема в разделе "Mod Rewrite / htaccess / ЧПУ", создана пользователем Runapa, 4 янв 2014.

  1. Runapa

    Runapa Постоялец

    Регистр.:
    30 окт 2010
    Сообщения:
    63
    Симпатии:
    5
    Объясните пожалуйста, почему последний блок когда он в конце не работает -

    Код:
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([_A-Za-z0-9-]+).([^/]+)-(.*)$ index.php?lang=$1&p=$2&page=$3 [L,QSA]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([_A-Za-z0-9-]+)/([^/]+)$ index.php?lang=$1&p=$2 [L,QSA]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)/(.*)/(.*)$ index.php?lang=$1&cat=$2&p=$3 [L,QSA]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([-a-zA-Z0-9_]+)/([-a-zA-Z0-9_]+)/([-a-zA-Z0-9_]+)-(.*)$ index.php?lang=$1&cat=$2&p=$3&page=$4 [QSA,L]
    
    а когда я переношу его в начало -

    Код:
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([-a-zA-Z0-9_]+)/([-a-zA-Z0-9_]+)/([-a-zA-Z0-9_]+)-(.*)$ index.php?lang=$1&cat=$2&p=$3&page=$4 [QSA,L]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([_A-Za-z0-9-]+).([^/]+)-(.*)$ index.php?lang=$1&p=$2&page=$3 [L,QSA]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([_A-Za-z0-9-]+)/([^/]+)$ index.php?lang=$1&p=$2 [L,QSA]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)/(.*)/(.*)$ index.php?lang=$1&cat=$2&p=$3 [L,QSA]
    
    , то всё работает ?
     
  2. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    322
    Симпатии:
    117
    Если правило в конце, то оно не срабатывает, так как срабатывает следующее правило, которое находится перед ним:
    Код:
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)/(.*)/(.*)$ index.php?lang=$1&cat=$2&p=$3 [L,QSA]
    Поменяй их местами и оно будет срабатывать...

    PS: кстати расшифруй, пожалуйста, эту конструкцию: [^/]+ (это сколько угодно слэшэй подряд, или что-то другое ?? )
     
    Runapa нравится это.
  3. Runapa

    Runapa Постоялец

    Регистр.:
    30 окт 2010
    Сообщения:
    63
    Симпатии:
    5
    Я в этом пока мало понимаю. Нашел в инете, когда искал правила для мод реврайт.
    Спасибо за подсказку.
     
  4. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    322
    Симпатии:
    117
    Ты бы тогда более подробно написал что тебе нужно сделать и исходный аштиаксес выложил, а то у меня есть большие подозрения насчёт правильности написания таких конструкций как
    Код:
    ^([_A-Za-z0-9-]+).([^/]+)-(.*)$
    или тут есть реальные ошибки, или я неправильно читаю:
    1) от начала сколько угодно маленьких или больших букв, цифер, нижних подчеркиваний и тире
    2) один любой символ
    3) сколько угодно всего кроме (непонятно для меня чего, ибо такой конструкции из одного слэша в скобках я не встречал нигде). Если бы это было тире в адресе, то этот слэш был бы сэкранирован так [^\/]
    4) тире
    5) сколько угодно любых символов (в том числе и слэшэй)
    6) конец строки (зачем он тут непонятно, ибо предыдущее правило говорит о том, что строка может содержать любое число символов, а значит закрывать её не имеет смысла)