netcrox
@netcrox
Всё время женат

Перенаправление без замены строки (mod_rewrite — RewriteRule) как реализовать?

Добрый день!

Пытаюсь в файле apache2/sites-available/domain.ru.conf настроить ЧПУ для всех поддоменов для ссылок вида:
subdomain.domain.ru/somePageName.html → subdomain.domain.ru/?page=somePageName

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

ЭТАП 1 (ПОПЫТКА 165)

Прописываю директивы:
RewriteCond %{REQUEST_URI} !([^/]*)\.html/$
RewriteRule ^/([^/]*)\.html$ /?page=$1 [L]

Получаю результаты в адресной строке (естественно, ничего не работает):
subdomain.domain.ru/news.html → subdomain.domain.ru/news.html/?page=news
subdomain.domain.ru/questions.html → subdomain.domain.ru/questions.html/?page=questions

ЭТАП 2 (КОПАЕМ ДАЛЬШЕ, ПОПЫТКИ 166-289+)

Рассматриваю весь блок, анализирую:
ServerName   domain.ru
        ServerAlias  *.domain.ru
        ServerSignature Off
        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^domain\.ru [NC]
        RewriteRule ^/(.*) http://www.domain.ru/$1 [L,R] # до этого места включительно все работает

        # вот, собственно, интересующий блок преобразований
        RewriteCond %{HTTP_HOST} ^([a-z0-9_-]+)\.domain\.ru$ [NC]
        RewriteRule ^(.*)\/([^/]*)\.html http://%1.domain.ru/?page=$2 [R,L]

Получаю результат немного отличный от того, что требовалось (адресная строка тоже заменяется):
subdomain.domain.ru/news.html → subdomain.domain.ru/?page=news
subdomain.domain.ru/questions.html → subdomain.domain.ru/?page=questions

Если убрать флаг R, то страничка делает слишком много переадресаций и умирает.

ЭТАП 3 (ВОЗВРАЩЕНИЕ К НАЧАЛУ)

Код из этапа 1 решил немного модифицировать и работает так же, как и код из этапа 2:
# было:
# RewriteCond %{REQUEST_URI} !([^/]*)\.html/$
# RewriteRule ^/([^/]*)\.html$ /?page=$1 [L]

# поменял REQUEST_URI на REQUEST_FILENAME
# и добавил в RewriteRule флаг R
# стало:
RewriteCond %{REQUEST_FILENAME} !([^/]*)\.html/$
RewriteRule ^/([^/]*)\.html$ /?page=$1 [R,L]

Результат тот же, что и в Э.2:
subdomain.domain.ru/news.html → subdomain.domain.ru/?page=news
subdomain.domain.ru/questions.html → subdomain.domain.ru/?page=questions
Прошу помощи...
  • Вопрос задан
  • 125 просмотров
Пригласить эксперта
Ответы на вопрос 2
shambler81
@shambler81 Куратор тега htaccess
RewriteCond %{HTTP_HOST} !^www\.domain\.ru [NC]
# если это ! = не сам домен с ввв
RewriteCond %{HTTP_HOST} ^(www\.|).+\.domain\.ru [NC]
# если это ввв или без ввв, плюс это 1 и более символов до основного домена, точки экранируем.
RewriteCond %{REQUEST_URI} ^(.+)\.(html|htm)$
# ну я так написал, у тебя тоже пойдет
RewriteCond %{REQUEST_FILENAME} !-d
# И это не директория.
RewriteCond %{REQUEST_FILENAME} !-f
# не является файлом.
RewriteCond %{REQUEST_FILENAME} -l
# и не линка, в общем это не физический объект
RewriteRule ^(.*)$ / http://domain.ru/\?page\=%2/? [R=301,L]
# Группа с реврайт гонда это не баксы а проценты, принцип тот -же, теперь подставляем домен в рул, и главное экранируем ? это воообщет спецсимвол. который кстати у нас стоит в конце, он удалит все гет параметры.
Естественно домен прописываем явно, поскольку нам нужно его сменить а это не часть урла.
Есл гужно сохранить протокол то правило обрастет еще 3 строками.
Ответ написан
@dodo512
ServerName   domain.ru
    ServerAlias  *.domain.ru
    ServerSignature Off
    
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^domain\.ru [NC]
    RewriteRule ^/(.*) http://www.domain.ru/$1 [L,R=301]
    
    RewriteCond %{HTTP_HOST} ^(www\.)?+.+\.domain\.ru$ [NC]
    RewriteRule ^/(.*)\.html$ /index.php?page=$1 [L]

Перед проверкой не забыть сбросить кеш браузера.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы