Mod_rewrite добавить расширение файла, удалить последний слэш, дописать букву l в .htm

Тема в разделе "Mod Rewrite / htaccess / ЧПУ", создана пользователем dandandan, 20 дек 2011.

  1. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Есть урл Например: localhost/hotel/mogu/prikrutit-golosovanie.html

    Надо:
    1. если урл вида /hotel/mogu/prikrutit-golosovanie
    добавить в конце .html

    2. если урл вида /hotel/mogu/prikrutit-golosov-anie/
    убрать последний слеш и добавить в конце .html, чтобы получилось localhost/hotel/mogu/prikrutit-golosovanie.html

    3. если урл вида /hotel/mogu/prikrutit-golosov-anie.htm
    добавить в конце букву L , чтобы получилось localhost/hotel/mogu/prikrutit-golosovanie.html

    4. Из полученного урла в переменную id записать hotel/mogu/prikrutit-golosovanie

    5. Первые 3 пункта должны сопровождаться 301 редериктом.

    6. Правила привязать только к директории, где находится файл htacsess (не знаю как сделать)

    Все запросы переводятся на скрипт index.php . Внутри скрипта стоит код:


    PHP:
    if (isset($_GET['id'])){
    echo 
    $_GET['id'];
    }
    else{
    echo 
    'Главная.';
    }
    PHP:
    RewriteEngine On
     
    # для 4 пункта
    RewriteRule ^(.*)\.html$ /index.php?id=$[L,NS]
     
    #Написал правила для первых 3 пунктов:
    # добавляем L в .html в конце если закончилось .htm
     
    RewriteCond %{REQUEST_URI} (.htm)$ [NC]
    RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1l [NS,L,R=301]
    # конец добавляем L в .html в конце если закончилось .htm
     
    # добавляем .html в конце если ссылка закончилась просто текстом со слешем на конце
    #удалил слеш на конце
    RewriteRule ^(.*)\/$ /$[NS,L,R=301]
    # конец добавляем .html в конце если ссылка закончилась просто текстом со слешем на конце
     
    # добавляем .html в конце если ссылка закончилась просто текстом без слеша на конце
    RewriteCond %{REQUEST_URI} !(\.html)$ [NC]
    RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1.html [NS,L,R=301]
    # конец добавляем .html в конце если ссылка закончилась просто текстом без слеша на конце
    По отдельности правила работают. При совмещении получаю ошибку в браузере: Неверное перенаправление на странице.

    Если закомментировать вот это правило: то все ок

    PHP:
    # добавляем .html в конце если ссылка закончилась просто текстом без слеша на конце
    RewriteCond %{REQUEST_URI} !(\.html)$ [NC]
    RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1.html [NS,L,R=301]
    # конец добавляем .html в конце если ссылка закончилась просто текстом без слеша на конце
    Что где подправить и может есть более лучшее решение?
     
  2. ShoxMaster

    ShoxMaster

    Регистр.:
    3 дек 2008
    Сообщения:
    393
    Симпатии:
    150
    Код:
    RewriteEngine on
    RewriteBase /hotel/mogu/
     
    RewriteRule (.+)\.htm$ /$1.html [R=301,L]
     
    RewriteCond %{REQUEST_URI} !\.html$
    RewriteRule (.+)/$ /$1.html [R=301,L]
     
    RewriteCond %{REQUEST_URI} !\.html$
    RewriteCond %{REQUEST_URI} !\..*$
    RewriteRule (.+) /$1.html [R=301,L]
     
    RewriteCond %{REQUEST_URI} \.html$
    RewriteCond %{QUERY_STRING} ^$
    RewriteRule ^(.*)\.html$ /index.php?id=$1 [L]
    
    Только в GET запрос будет отправлятся полный URL относительно сервера.
     
  3. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Перехожу по ссылке

    http://localhost/1/2.html

    Перекидывает на эту страницу:

    http://localhost/index.php?id=1/2


    Проверил в другом браузере. Там нормально работает. Видимо закешировались страницы. Если не поможет, то отпишусь.

    В обоих браузерах не работает редерикт с .htm на .html