ЧПУ и htaccess

Тема в разделе "Mod Rewrite / htaccess / ЧПУ", создана пользователем repacksman, 3 апр 2015.

  1. repacksman

    repacksman

    Регистр.:
    12 июн 2012
    Сообщения:
    154
    Симпатии:
    2
    Доброго времени суток форумчане. Подскажите что написать в файле htaccess чтоб ЧПУ виглядели так:

    /packets.php в /
    /packet_group_info.php?packet_group=ntv в /ntv/
    /test.php в /test/
    /test в /test/
     
  2. svfolder

    svfolder Постоялец

    Регистр.:
    31 июл 2013
    Сообщения:
    95
    Симпатии:
    39
    1)

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /packets\.(php|htm|html|shtml|asp|aspx)\ HTTP/
    RewriteCond %{HTTP_HOST} ^site\.ru$
    RewriteRule ^packets\.(php|htm|html|shtml|asp|aspx)$ http://site.ru/ [R=301,L]

    3
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /test\.(php|htm|html|shtml|asp|aspx)\ HTTP/
    RewriteCond %{HTTP_HOST} ^site\.ru$
    RewriteRule ^test\.(php|htm|html|shtml|asp|aspx)$ http://site.ru/test/ [R=301,L]

    4
    RewriteRule ^test$ /test/ [R=301,L]


    2 незнаю...


    1 и 2 усложнено, там и php и htm и html и т.д. от всех болезней сразу )
    Можно проще.

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /packets\.php\ HTTP/
    RewriteCond %{HTTP_HOST} ^site\.ru$
    RewriteRule ^packets\.php$ http://site.ru/ [R=301,L]

    2 по аналогии.
     
    Последнее редактирование: 3 апр 2015
    repacksman нравится это.
  3. repacksman

    repacksman

    Регистр.:
    12 июн 2012
    Сообщения:
    154
    Симпатии:
    2

    А есть какойто вариант для ЧПУ всех php файлов в корневой директории одновременно. Чтоб для каждого файла не прописивать(их там более 20-ти)

    /test.php в /test/
    /test в /test/
     
  4. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    188
    Симпатии:
    227
    Если отдельные правила для многих файлов, то там тогда получается на каждый файл требуются отдельные RewriteRule и RewriteCond. Хотя можно сократить число строк, используя один RewriteRule на всех и по одному RewriteCond на каждый файл.
    Например:
    /page1.php => /foo
    /page2.php => /bar
    /page3.php => /lol
    Код:
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,7}\ (\S+)\ HTTP
    RewriteCond foo;%1 ^(.*?);/page1.php$ [OR]
    RewriteCond bar;%1 ^(.*?);/page2.php$ [OR]
    RewriteCond lol;%1 ^(.*?);/page3.php$
    RewriteRule ^ /%1 [R=301,L]
    
    А если запихивать все в одну строку, то сильно страдает читабельность.
    Код:
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,7}\ (\S+)\ HTTP
    RewriteCond %1;/page1.php=foo;/page2.php=bar;/page3.php=lol ^([^;]+).*?;\1=([^;]+)
    RewriteRule ^ /%2 [R=301,L]
    
    Попытка улучшить читабельность :D
    Код:
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,7}\ /(\S*)\ HTTP
    RewriteCond %1\ page1.php=>foo\ page2.php=>bar\ page3.php=>lol ^(\S+).*?\ \1=>(\S+)
    RewriteRule ^ /%2 [R=301,L]
    

    Хотя тут, похоже, просто вырезать ".php" и дополнительно делать редирект для адресов без слеша на конце.
    Код:
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,7}\ /([^/.]+)(\.php)?\ HTTP
    RewriteRule ^ /%1/ [R=301,L]
    
    Для /packet_group_info.php?packet_group=ntv при редиректе нужно сбросить get параметры, добавив знак вопроса после /ntv/.
    Код:
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,7}\ /packet_group_info\.php\?packet_group=ntv\ HTTP
    RewriteRule ^ /ntv/? [R=301,L]
    
     
    latteo и repacksman нравится это.
  5. repacksman

    repacksman

    Регистр.:
    12 июн 2012
    Сообщения:
    154
    Симпатии:
    2
    /packet_group_info.php?packet_group=ntv

    Вся проблемма в том что "ntv" сменная. Как теперь написать

    Типа
    /packet_group_info.php?packet_group=ntv в /ntv/
    /packet_group_info.php?packet_group=apple в /apple/
     
  6. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    188
    Симпатии:
    227
    Код:
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,7}\ /packet_group_info\.php\?packet_group=([^&]+)\ HTTP
    RewriteRule ^ /%1/? [R=301,L]
    
     
    repacksman и latteo нравится это.