Помощь с редиректом

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

Статус темы:
Закрыта.
  1. Rabben

    Rabben

    Регистр.:
    26 мар 2009
    Сообщения:
    159
    Симпатии:
    10
    Хочу сделать смену языка по поддомену. Смена языка осуществляется http://domain.com/?&lang_id=x(где x номер id языка). Добавил поддомен en.domain.com, в htaccess написал:

    Код:
    RewriteCond %{HTTP_HOST} ^en.domain.com$ [OR]
    RewriteCond %{HTTP_HOST} ^www.en.domain.com$
    RewriteRule ^/?$ "http\:\/\/en\.domain\.com\/\?\&lang_id\=2" [L,R=301]
    но происходит бесконечный редирект.
    Помогите поправить код и по возможности, помогите из этого преобразовать невидимые редирект. Заранее спасибо.
     
  2. ShoxMaster

    ShoxMaster

    Регистр.:
    3 дек 2008
    Сообщения:
    393
    Симпатии:
    150
    Попробуйте так:
    Код:
    RewriteCond %{HTTP_HOST} ^en.domain.com$ [OR]
    RewriteCond %{HTTP_HOST} ^www.en.domain.com$
    RewriteRule en.domain.com$ "http\:\/\/en\.domain\.com\/\?\&lang_id\=2" [L]
    Под ваше правило ^/?$ просто попадали все запросы, и происходил бесконечный редирект.
     
  3. Rabben

    Rabben

    Регистр.:
    26 мар 2009
    Сообщения:
    159
    Симпатии:
    10
    Не редиректит в этом случае вообще.

    Нашел вот что:

    Код:
    RewriteCond %{QUERY_STRING} !lang_id=
    RewriteCond %{HTTP_HOST} ^domain.com$
    RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1?&lang_id=1&%{QUERY_STRING} [R=301,L]
    Остаётся 1 вопрос, как скрыть
    Код:
    ?&lang_id=x
     
  4. ShoxMaster

    ShoxMaster

    Регистр.:
    3 дек 2008
    Сообщения:
    393
    Симпатии:
    150
    Код:
    RewriteCond %{QUERY_STRING} !lang_id=
    RewriteCond %{HTTP_HOST} ^domain.com$
    RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1?&lang_id=1&%{QUERY_STRING} [L]
     
  5. Rabben

    Rabben

    Регистр.:
    26 мар 2009
    Сообщения:
    159
    Симпатии:
    10
    Проверял, тогда
    Код:
    ?&lang_id=x
    не убирается, а страница вообще не загружается.

    Добавлено через 13 минут
    Вот еще появился вопрос, как сделать исключение для определенных папок?
     
  6. ShoxMaster

    ShoxMaster

    Регистр.:
    3 дек 2008
    Сообщения:
    393
    Симпатии:
    150
    Тоесть не грузится? Какой код возвращает сервер, 500 или 404?
    Через RewriteCond и проверку входит ли папка в REQUEST_URI/REQUEST_FILENAME.
    Тоесть:
    Код:
    RewriteCond %{REQUEST_URI} .*path.*
    RewriteRule .* http://google.com [R=301]
    
    В этом случае, запрос с набором символов path будет редиректить.
     
  7. Rabben

    Rabben

    Регистр.:
    26 мар 2009
    Сообщения:
    159
    Симпатии:
    10
    404. Насчет второго я видно не так выразился. У меня на сервере есть запороленная папка, при входе в нее, добавляется ?&lang_id, из-за чего сразу редиректит на 401. Хочу сделать исключение для этой папки, чтоб её вообще редирект не затрагивал.
     
  8. ShoxMaster

    ShoxMaster

    Регистр.:
    3 дек 2008
    Сообщения:
    393
    Симпатии:
    150
    Код:
    RewriteCond %{REQUEST_URI} !^\/path$
    Для всех других папок RewriteRule будут исполнятся.

    Код:
    RewriteCond %{QUERY_STRING} !lang_id=
    RewriteCond %{HTTP_HOST} ^domain.com$
    RewriteCond %{REQUEST_URI} !^\/path$
    RewriteRule ^(.*)$ /$1?&lang_id=1 [L,QSA]
    
    Попробуйте ещё такой .htaccess, %{QUERY_STRING} добавлять необязательно, есть флаг QSA, который его сохраняет. А внешнего неявного редиректа быть не может, и через то не работает правило если убрать R=301.
     
    4ksner и Rabben нравится это.
  9. Rabben

    Rabben

    Регистр.:
    26 мар 2009
    Сообщения:
    159
    Симпатии:
    10
    Спасибо, но вот почему то с RewriteEngine On не работает ... Тогда выбивает 500
    Код:
    Options +FollowSymLinks
    Options +Indexes
    RewriteEngine On
    
    RewriteCond %{HTTP_HOST}  ^www\.(.+)$  [NC]
    RewriteRule ^(.*)         http://%1/$1 [L,R=301]
    
    RewriteCond %{HTTP_HOST} ^domain.com$
    RewriteCond %{REQUEST_URI} !^\/admin$
    RewriteRule ^(.*)$ /$1?&lang_id=1 [L,QSA]
    
    RewriteCond %{HTTP_HOST} ^ru.domain.com$
    RewriteCond %{REQUEST_URI} !^\/admin$
    RewriteRule ^(.*)$ /$1?&lang_id=2 [L,QSA]
    
    RewriteCond %{HTTP_HOST} ^by.domain.com$
    RewriteCond %{REQUEST_URI} !^\/admin$
    RewriteRule ^(.*)$ /$1?&lang_id=3 [L,QSA]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^test$ test.php [L,QSA]
    RewriteRule ^test/$ test.php [L,QSA]
    RewriteRule ^test2$ test2.php [L,QSA]
    RewriteRule ^test2/$ test2.php [L,QSA]
    RewriteRule ^test3$ test3.php [L,QSA]
    RewriteRule ^test3/$ test3.php [L,QSA]
    
    RewriteRule ^(config|wp) http://www.microsoft.com [L,NC]
    
     
Статус темы:
Закрыта.